logo       

samba3-vscan/avast vscan-avastd.c,1.1,1.2 vscan-avastd_core.c,1.1,1.2: msg#00000

Subject: samba3-vscan/avast vscan-avastd.c,1.1,1.2 vscan-avastd_core.c,1.1,1.2
Update of /cvsroot/openantivirus/samba3-vscan/avast
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9923/avast

Modified Files:
        vscan-avastd.c vscan-avastd_core.c 
Log Message:
avastd module now in sync with rest of the modules


Index: vscan-avastd.c
===================================================================
RCS file: /cvsroot/openantivirus/samba3-vscan/avast/vscan-avastd.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- vscan-avastd.c      29 Aug 2005 12:51:22 -0000      1.1
+++ vscan-avastd.c      2 Oct 2005 12:27:43 -0000       1.2
@@ -5,11 +5,8 @@
  * Copyright (C) Frantisek Mensik, 2005
  *               ALWIL Software <mensik-WNaN+BNhABw@xxxxxxxxxxxxxxxx>
  *
- * base on the F-Prot Daemon module by
- * Copyright (C) Rainer Link, 2001-2003
- *               OpenAntiVirus.org 
<rainer-pBPPa8WU5k41Tgt60Rntydi2O/JbrIOy@xxxxxxxxxxxxxxxx>
- * Copyright (C) Stefan (metze) Metzmacher, 2003
- *               <metze-pz2UNc6q77cb1SvskN2V4Q@xxxxxxxxxxxxxxxx>
+ * Copyright (C) Rainer Link, 2005
+ *              OpenAntiVirus.org 
<rainer-pBPPa8WU5k41Tgt60Rntydi2O/JbrIOy@xxxxxxxxxxxxxxxx>
  *
  * based on the audit VFS module by
  * Copyright (C) Tim Potter, 1999-2000
@@ -45,33 +42,12 @@
 
 #define VSCAN_MODULE_STR "vscan-avastd"
 
+vscan_config_struct vscan_config; /* contains the vscan module configuration */
+
 fstring config_file;            /* location of config file, either
                                    PARAMCONF or as set via vfs options
                                 */
-
-ssize_t max_size;              /* do not scan files greater than max_size
-                                   if max_size = 0, scan any file
-                                */
-
 BOOL verbose_file_logging;     /* log ever file access */
-
-BOOL scan_on_open;             /* scan a file before it is opened
-                                   Defaults to True
-                                */
-
-BOOL scan_on_close;            /* scan a new file put on share or
-                                   if file was modified
-                                   Defaults to False
-                                */
-
-BOOL deny_access_on_error;      /* if connection to daemon fails,  should 
access to any
-                                   file be denied? Defaults to True 
-                               */
-
-
-BOOL deny_access_on_minor_error; /* if daemon returns non-critical error,
-                                    should access to the file be denied? */
-
 BOOL send_warning_message;     /* send a warning message using the windows
                                   messenger service? */
 
@@ -79,88 +55,27 @@
 pstring avastd_port;           /* port number avast! daemon listens on */
 fstring avastd_socket_file;    /* socket name for avast! daemon */
 
-fstring quarantine_dir;                /* directory for infected files */
-fstring quarantine_prefix;     /* prefix for infected files */
-
-enum infected_file_action_enum infected_file_action; /* what to do with 
infected files;
-                                                        defaults to quarantine 
*/
-
-int max_lrufiles;               /* specified the maximum entries in lrufiles 
list */
-time_t lrufiles_invalidate_time; /* specified the time in seconds after the 
lifetime
-                                    of an entry is expired and entry will be 
invalidated */
-
-pstring exclude_file_types;    /* list of file types which should be excluded 
from scanning */
-
-
-
 /* module version */
 static const char module_id[]=VSCAN_MODULE_STR" "SAMBA_VSCAN_VERSION_STR;
 
 
 static BOOL do_parameter(const char *param, const char *value)
 {
-        if ( StrCaseCmp("max file size", param) == 0 ) {
-               /* FIXME: sanity check missing! what, if value is out of range?
-                  atoi returns int - what about LFS? atoi should be avoided!
-               */
-                max_size = atoi(value);
-                DEBUG(3, ("max file size is: %d\n", max_size));
-        } else if ( StrCaseCmp("verbose file logging", param) == 0 ) {
-                set_boolean(&verbose_file_logging, value);
-                DEBUG(3, ("verbose file logging is: %d\n", 
verbose_file_logging));
-        } else if ( StrCaseCmp("scan on open", param) == 0 ) {
-                set_boolean(&scan_on_open, value);
-                DEBUG(3, ("scan on open: %d\n", scan_on_open));
-        } else if ( StrCaseCmp("scan on close", param) == 0 ) {
-                set_boolean(&scan_on_close, value);
-                DEBUG(3, ("scan on close is: %d\n", scan_on_close));
-        } else if ( StrCaseCmp("deny access on error", param) == 0 ) {
-                set_boolean(&deny_access_on_error, value);
-                DEBUG(3, ("deny access on error is: %d\n", 
deny_access_on_error));
-        } else if ( StrCaseCmp("deny access on minor error", param) == 0 ) {
-                set_boolean(&deny_access_on_minor_error, value);
-                DEBUG(3, ("deny access on minor error is: %d\n", 
deny_access_on_minor_error));
-        } else if ( StrCaseCmp("send warning message", param) == 0 ) {
-                set_boolean(&send_warning_message, value);
-                DEBUG(3, ("send warning message is: %d\n", 
send_warning_message));
-        } else if ( StrCaseCmp("infected file action", param) == 0 ) {
-               if (StrCaseCmp("quarantine", value) == 0) {
-                       infected_file_action = INFECTED_QUARANTINE;
-               } else if (StrCaseCmp("delete", value) == 0) {
-                       infected_file_action = INFECTED_DELETE;
-               } else if (StrCaseCmp("nothing", value) == 0) {
-                       infected_file_action = INFECTED_DO_NOTHING;
-               } else {
-                       DEBUG(2, ("samba-vscan: badly formed infected file 
action in configuration file, parameter %s\n", value));
-               }
-                DEBUG(3, ("infected file action is: %d\n", 
infected_file_action));
-        } else if ( StrCaseCmp("quarantine directory", param) == 0 ) {
-                fstrcpy(quarantine_dir, value);
-                DEBUG(3, ("quarantine directory is: %s\n", quarantine_dir));
-        } else if ( StrCaseCmp("quarantine prefix", param) == 0 ) {
-                fstrcpy(quarantine_prefix, value);
-                DEBUG(3, ("quarantine prefix is: %s\n", quarantine_prefix));
-       } else if ( StrCaseCmp("max lru files entries", param) == 0 ) {
-               max_lrufiles = atoi(value);
-               DEBUG(3, ("max lru files entries is: %d\n", max_lrufiles));
-       } else if ( StrCaseCmp("lru file entry lifetime", param) == 0 ) {
-               lrufiles_invalidate_time = atol(value);
-               DEBUG(3, ("lru file entry lifetime is: %li\n", 
(long)lrufiles_invalidate_time)); 
-       } else if ( StrCaseCmp("exclude file types", param) == 0 ) {
-               pstrcpy(exclude_file_types, value);
-               DEBUG(3, ("Exclude list is: %s\n", exclude_file_types));
-       } else if ( StrCaseCmp("avastd ip", param) == 0 ) {
-               fstrcpy(avastd_ip, value);
-               DEBUG(3, ("avastd ip is: %s\n", avastd_ip));
-       } else if ( StrCaseCmp("avastd port", param) == 0 ) {
-               pstrcpy(avastd_port, value);
-               DEBUG(3, ("avastd port is: %s\n", avastd_port));
-       } else if ( StrCaseCmp("avastd socket file", param) == 0 ) {
-               fstrcpy(avastd_socket_file, value);
-               DEBUG(3, ("avastd socket file is %s\n", avastd_socket_file));
-        } else
-                DEBUG(3, ("unknown parameter: %s\n", param));
 
+        if ( do_common_parameter(&vscan_config, param, value) == False ) {
+               /* parse VFS module-specific configuration values */
+               if ( StrCaseCmp("avastd ip", param) == 0 ) {
+                       fstrcpy(avastd_ip, value);
+                       DEBUG(3, ("avastd ip is: %s\n", avastd_ip));
+               } else if ( StrCaseCmp("avastd port", param) == 0 ) {
+                       pstrcpy(avastd_port, value);
+                       DEBUG(3, ("avastd port is: %s\n", avastd_port));
+               } else if ( StrCaseCmp("avastd socket file", param) == 0 ) {
+                       fstrcpy(avastd_socket_file, value);
+                       DEBUG(3, ("avastd socket file is %s\n", 
avastd_socket_file));
+               } else
+                       DEBUG(3, ("unknown parameter: %s\n", param));
+       }
         return True;
 }
 
@@ -170,61 +85,14 @@
         return True;
 }
 
-
-
-
-/* Implementation of vfs_ops.  */
-
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
 static int vscan_connect(vfs_handle_struct *handle, connection_struct *conn, 
const char *svc, const char *user)
-#else
-static int vscan_connect(struct connection_struct *conn, PROTOTYPE_CONST char 
*svc, PROTOTYPE_CONST char *user)
-#endif
 {
-       #if (SAMBA_VERSION_MAJOR==2 && SAMBA_VERSION_RELEASE>=4) || 
SAMBA_VERSION_MAJOR==3
-        #if !(SMB_VFS_INTERFACE_VERSION >= 6)
-          pstring opts_str;
-          PROTOTYPE_CONST char *p;
-        #endif
-       #endif
+        fstring config_file;            /* location of config file, either
+                                           PARAMCONF or as set via vfs options
+                                       */
         int retval;
 
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
         vscan_syslog("samba-vscan (%s) connected (Samba 3.0), (c) by Rainer 
Link, OpenAntiVirus.org", module_id);
-#endif
-
-        /* set default value for configuration files */
-        fstrcpy(config_file, PARAMCONF);
-
-        /* set default value for max file size */
-        max_size = VSCAN_MAX_SIZE;
-
-        /* set default value for file logging */
-        verbose_file_logging = VSCAN_VERBOSE_FILE_LOGGING;
-
-        /* set default value for scan on open() */
-        scan_on_open = VSCAN_SCAN_ON_OPEN;
-
-        /* set default value for scan on close() */
-        scan_on_close = VSCAN_SCAN_ON_CLOSE;
-
-        /* set default value for deny access on error */
-        deny_access_on_error = VSCAN_DENY_ACCESS_ON_ERROR;
-
-       /* set default value for deny access on minor error */
-       deny_access_on_minor_error = VSCAN_DENY_ACCESS_ON_MINOR_ERROR;
- 
-       /* set default value for send warning message */
-       send_warning_message = VSCAN_SEND_WARNING_MESSAGE;
-
-        /* set default value for infected file action */
-        infected_file_action = VSCAN_INFECTED_FILE_ACTION;
-
-        /* set default value for quarantine directory */
-        fstrcpy(quarantine_dir, VSCAN_QUARANTINE_DIRECTORY);
-
-        /* set default value for quarantine prefix */
-        fstrcpy(quarantine_prefix, VSCAN_QUARANTINE_PREFIX);
 
        /* set default value for avast! daemon IP */
        fstrcpy(avastd_ip, VSCAN_AVASTD_IP);
@@ -235,75 +103,37 @@
        /* set default value for avast! daemon socket file */
        fstrcpy(avastd_socket_file, VSCAN_AVASTD_SOCKET_FILE);
 
-        /* set default value for maximum lrufile entries */
-        max_lrufiles = VSCAN_MAX_LRUFILES;
-
-        /* time after an entry is considered as expired */
-        lrufiles_invalidate_time = VSCAN_LRUFILES_INVALIDATE_TIME;
-
-       /* file type exclude ist */
-       pstrcpy(exclude_file_types, VSCAN_FT_EXCLUDE_LIST);     
-
-
        vscan_syslog("INFO: connect to service %s by user %s", 
               svc, user);
 
-       #if (SAMBA_VERSION_MAJOR==2 && SAMBA_VERSION_RELEASE>=4) || 
SAMBA_VERSION_MAJOR==3
-        #if (SMB_VFS_INTERFACE_VERSION >= 6)
-         fstrcpy(config_file, 
lp_parm_const_string(SNUM(conn),VSCAN_MODULE_STR,"config-file",PARAMCONF));
-        #else
-          pstrcpy(opts_str, (const char*) lp_vfs_options(SNUM(conn)));
-          if( !*opts_str ) {
-                DEBUG(3, ("samba-vscan: no configuration file set - using 
default value (%s).\n", lp_vfs_options(SNUM(conn))));
-          } else {
-                p = opts_str;
-                if ( next_token(&p, config_file, "=", sizeof(config_file)) ) {
-                        trim_string(config_file, " ", " ");
-                        if ( !strequal("config-file", config_file) ) {
-                                DEBUG(3, ("samba-vscan - connect: options %s 
is not config-file\n", config_file));
-                                /* setting default value */
-                                fstrcpy(config_file, PARAMCONF);
+       fstrcpy(config_file, get_configuration_file(conn, VSCAN_MODULE_STR, 
PARAMCONF));
+       DEBUG(3, ("configuration file is: %s\n", config_file));
 
-                        } else {
-                                if ( !next_token(&p, config_file," 
\n",sizeof(config_file)) ) {
-                                        DEBUG(3, ("samba-vscan - connect: no 
option after config-file=\n"));
-                                        /* setting default value */
-                                        fstrcpy(config_file, PARAMCONF);
-                                } else {
-                                        trim_string(config_file, " ", " ");
-                                        DEBUG(3, ("samba-vscan - connect: 
config file name is %s\n", config_file));
-                                }
-                        }
-                }
-          }
-         #endif /*  #if (SMB_VFS_INTERFACE_VERSION >= 6)*/
-          retval = pm_process(config_file, do_section, do_parameter);
-          DEBUG(10, ("pm_process returned %d\n", retval));
-         if (!retval) vscan_syslog("ERROR: could not parse configuration file 
'%s'. File not found or not read-able. Using compiled-in defaults", 
config_file);
-       #endif
+       retval = pm_process(config_file, do_section, do_parameter);
+
+       /* FIXME: this is lame! */
+       verbose_file_logging = vscan_config.common.verbose_file_logging;
+       send_warning_message = vscan_config.common.send_warning_message;
+
+       DEBUG(10, ("pm_process returned %d\n", retval));
+       if (!retval) vscan_syslog("ERROR: could not parse configuration file 
'%s'. File not found or not read-able. Using compiled-in defaults", 
config_file);
 
         /* initialise lrufiles list */
         DEBUG(5, ("init lrufiles list\n"));
-        lrufiles_init(max_lrufiles, lrufiles_invalidate_time);
+        lrufiles_init(vscan_config.common.max_lrufiles, 
vscan_config.common.lrufiles_invalidate_time);
 
        /* initialise filetype */
        DEBUG(5, ("init file type\n"));
-       filetype_init(0, exclude_file_types);
+       filetype_init(0, vscan_config.common.exclude_file_types);
 
+        /* initialise file regexp */
+        fileregexp_init(vscan_config.common.exclude_file_regexp);
 
-       #if (SMB_VFS_INTERFACE_VERSION >= 6)
-        return SMB_VFS_NEXT_CONNECT(handle, conn, svc, user);
-       #else
-        return default_vfs_ops.connect(conn, svc, user);
-       #endif
+       return SMB_VFS_NEXT_CONNECT(handle, conn, svc, user);
 
 }
 
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
 static void vscan_disconnect(vfs_handle_struct *handle, connection_struct 
*conn)
-#else/* Samba 3.0 alphaX */
-static void vscan_disconnect(struct connection_struct *conn)
-#endif
 {
 
        vscan_syslog("INFO: disconnected");
@@ -311,29 +141,16 @@
         lrufiles_destroy_all();
        filetype_close();
 
-
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
        SMB_VFS_NEXT_DISCONNECT(handle, conn);
-#else
-       default_vfs_ops.disconnect(conn);
-#endif
 }
 
-
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
 static int vscan_open(vfs_handle_struct *handle, connection_struct *conn, 
const char *fname, int flags, mode_t mode)
-#else
-static int vscan_open(struct connection_struct *conn, PROTOTYPE_CONST char 
*fname, int flags, mode_t mode)
-#endif
 {
-       int retval, must_be_checked;
+       int retval, must_be_checked, rc, sockfd;
        SMB_STRUCT_STAT stat_buf;
-       int sockfd;
        pstring filepath;
        char client_ip[CLIENT_IP_SIZE];
 
-       int rc;
-
 
        /* Assemble complete file path */
        pstrcpy(filepath, conn->connectpath);
@@ -341,94 +158,68 @@
        pstrcat(filepath, fname);
 
         /* scan files while opening? */
-        if ( !scan_on_open ) {
+        if ( !vscan_config.common.scan_on_open ) {
                 DEBUG(3, ("samba-vscan - open: File '%s' not scanned as 
scan_on_open is not set\n", fname));
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
-               return SMB_VFS_NEXT_OPEN(handle, conn, fname, flags, mode);
-#else
-                return default_vfs_ops.open(conn, fname, flags, mode);
-#endif                         
         }
+        else if ( (SMB_VFS_NEXT_STAT(handle, conn, fname, &stat_buf)) != 0 ) { 
   /* an error occured */
+                if ( errno == ENOENT ) {
+                        if ( verbose_file_logging )
+                                vscan_syslog("INFO: File %s not found! Not 
scanned!", fname);
+                }
+                else {
+                        vscan_syslog("ERROR: File %s not readable or an error 
occured", fname);
+                }
+        }
+        else if ( S_ISDIR(stat_buf.st_mode) ) {         /* is it a directory? 
*/
+                if ( verbose_file_logging )
+                        vscan_syslog("INFO: File %s is a directory! Not 
scanned!", fname);
+        }
+        else if ( ( stat_buf.st_size > vscan_config.common.max_size ) && ( 
vscan_config.common.max_size > 0 ) ) { /* file is
+too large */
+                if ( vscan_config.common.verbose_file_logging )
+                        vscan_syslog("INFO: File %s is larger than specified 
maximum file size! Not scanned!", fname);
+        }
+        else if ( stat_buf.st_size == 0 ) { /* do not scan empty files */
+                if ( vscan_config.common.verbose_file_logging )
+                        vscan_syslog("INFO: File %s has size zero! Not 
scanned!", fname);
+        }
+        else if ( fileregexp_skipscan(filepath) == VSCAN_FR_SKIP_SCAN ) {
+                if ( vscan_config.common.verbose_file_logging )
+                        vscan_syslog("INFO: File '%s' not scanned as file is 
machted by exclude regexp", filepath);
+        }
+        else if ( filetype_skipscan(filepath) == VSCAN_FT_SKIP_SCAN ) {
+                if ( verbose_file_logging )
+                        vscan_syslog("INFO: File '%s' not scanned as file type 
is on exclude list", filepath);
+        } else if ( (must_be_checked = lrufiles_must_be_checked(filepath, 
stat_buf.st_mtime)) == VSCAN_LRU_DENY_ACCESS ) {
+                /* file has already been checked and marked as infected */
+                /* deny access */
+                if ( vscan_config.common.verbose_file_logging )
+                        vscan_syslog("INFO: File '%s' has already been scanned 
and marked as infected. Not scanned any more. Access denied", filepath);
 
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
-        if ( (SMB_VFS_NEXT_STAT(handle, conn, fname, &stat_buf)) != 0 )    /* 
an error occured */ 
-               return SMB_VFS_NEXT_OPEN(handle, conn, fname, flags, mode);
-#else
-        if ( (default_vfs_ops.stat(conn, fname, &stat_buf)) != 0 )    /* an 
error occured */ 
-               return default_vfs_ops.open(conn, fname, flags, mode);
-#endif
-       else if ( S_ISDIR(stat_buf.st_mode) )   /* is it a directory? */
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
-               return SMB_VFS_NEXT_OPEN(handle, conn, fname, flags, mode);
-#else
-               return default_vfs_ops.open(conn, fname, flags, mode);
-#endif
-       else if ( ( stat_buf.st_size > max_size ) && ( max_size > 0 ) ) /* file 
is too large */
-               vscan_syslog("INFO: File %s is larger than specified maximum 
file size! Not scanned!", fname);
-       else if ( stat_buf.st_size == 0 ) /* do not scan empty files */
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
-               return SMB_VFS_NEXT_OPEN(handle, conn, fname, flags, mode);
-#else
-               return default_vfs_ops.open(conn, fname, flags, mode);
-#endif
-       else if ( filetype_skipscan(filepath) == 1 ) {
-               if ( verbose_file_logging )
-                       vscan_syslog("File '%s' not scanned as file type is on 
exclude list", filepath);
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
-                return SMB_VFS_NEXT_OPEN(handle, conn, fname, flags, mode);
-#else
-                return default_vfs_ops.open(conn, fname, flags, mode);
-#endif
-       } else  
-       {
+                /* deny access */
+                errno = EACCES;
+                return -1;
+        } else if ( must_be_checked == VSCAN_LRU_GRANT_ACCESS )  {
+                /* file has already been checked, not marked as infected and 
not modified */
+                if ( vscan_config.common.verbose_file_logging )
+                        vscan_syslog("INFO: File '%s' has already been 
scanned, not marked as infected and not modified. Not scanned anymore. Access 
granted", filepath);
+       } else {
                /* open socket */
                sockfd = vscan_avastd_init();
                
-               if ( sockfd == -1 && deny_access_on_error ) {
+               if ( sockfd == -1 && vscan_config.common.deny_access_on_error ) 
{
                        /* an error occured - can not communicate to daemon - 
deny access */
                        vscan_syslog("ERROR: can not communicate to daemon - 
access denied");
                        errno = EACCES;
                        return -1;
                } else if ( sockfd >= 0 ) 
                {
-
                        /* get client IP */
                        safe_strcpy(client_ip, conn->client_address, 
CLIENT_IP_SIZE -1);
 
-                        /* must file actually be scanned? */
-                        must_be_checked = lrufiles_must_be_checked(filepath, 
stat_buf.st_mtime);
-                        if ( must_be_checked == -1 ) {
-                                /* file has already been checked and marked as 
infected */
-                                /* deny access */
-                                if ( verbose_file_logging )
-                                        vscan_syslog("File '%s' has already 
been scanned and marked as infected. Not scanned any more. Access denied", 
filepath);
-                       
-                               /* close socket */
-                               vscan_avastd_end(sockfd);
-
-                               /* deny access */
-                               errno = EACCES;
-                               return -1;
-                       } else if ( must_be_checked == 0 )  {
-                               /* file has already been checked, not marked as 
infected and not modified */
-                               if ( verbose_file_logging )
-                                       vscan_syslog("File '%s' has already 
been scanned, not marked as infected and not modified. Not scanned anymore. 
Access granted", filepath);
-       
-                               /* close socket */
-                               vscan_avastd_end(sockfd);
-
-                               /* grant access */
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
-                               return SMB_VFS_NEXT_OPEN(handle, conn, fname, 
flags, mode);
-#else
-                               return default_vfs_ops.open(conn, fname, flags, 
mode);
-#endif
-                        }
-                        /* ok, we must check the file */
-
                        /* scan file */
                        retval = vscan_avastd_scanfile(sockfd, filepath, 
client_ip);
-                       if ( retval == -2 && deny_access_on_minor_error ) {
+                       if ( retval == VSCAN_SCAN_MINOR_ERROR && 
vscan_config.common.deny_access_on_minor_error ) {
                                /* a minor error occured - deny access */
                                vscan_syslog("ERROR: daemon failed with a minor 
error - access to file %s denied", fname);
 
@@ -441,7 +232,7 @@
                                /* deny access */
                                errno = EACCES;
                                return -1;
-                       } else if ( retval == -1 && deny_access_on_error ) {
+                       } else if ( retval == VSCAN_SCAN_ERROR  && 
vscan_config.common.deny_access_on_error ) {
                                /* an error occured - can not communicate to 
daemon - deny access */
                                vscan_syslog("ERROR: can not communicate to 
daemon - access to file %s denied", fname);
 
@@ -452,19 +243,14 @@
                                 lrufiles_delete(filepath);
 
                                 /* deny access */
-
                                 errno = EACCES;
                                 return -1;
-                       } else if ( retval == 1 ) {
+                       } else if ( retval == VSCAN_SCAN_VIRUS_FOUND ) {
                                /* close socket */
                                vscan_avastd_end(sockfd);
                                /* do action ... */
-                               
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
-                               rc = vscan_do_infected_file_action(handle, 
conn, filepath, quarantine_dir, quarantine_prefix, infected_file_action);
-#else
-                               rc = 
vscan_do_infected_file_action(&default_vfs_ops, conn, filepath, quarantine_dir, 
quarantine_prefix, infected_file_action);
-#endif
+
+                               rc = vscan_do_infected_file_action(handle, 
conn, filepath, vscan_config.common.quarantine_dir, 
vscan_config.common.quarantine_prefix, 
vscan_config.common.infected_file_action);
 
                                 /* add/update file. mark file as infected! */
                                 lrufiles_add(filepath, stat_buf.st_mtime, 
True);
@@ -472,7 +258,7 @@
                                /* virus found, deny acces */
                                errno = EACCES; 
                                return -1;
-                        } else if ( retval == 0 ) {
+                        } else if ( retval == VSCAN_SCAN_OK  ) {
                                 /* file is clean, add to lrufiles */
                                 lrufiles_add(filepath, stat_buf.st_mtime, 
False);
                         }
@@ -482,84 +268,84 @@
                vscan_avastd_end(sockfd);
 
        }
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
        return SMB_VFS_NEXT_OPEN(handle, conn, fname, flags, mode);
-#else
-       return default_vfs_ops.open(conn, fname, flags, mode);
-#endif
 }
 
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
 static int vscan_close(vfs_handle_struct *handle, files_struct *fsp, int fd)
-#else
-static int vscan_close(struct files_struct *fsp, int fd)
-#endif
 {
+       SMB_STRUCT_STAT stat_buf;
        pstring filepath;
-        int retval, rv, rc;
-       int sockfd;
+        int retval = 0, rv = 0, rc = 0, sockfd;
        char client_ip[CLIENT_IP_SIZE];
 
         /* First close the file */
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
         retval = SMB_VFS_NEXT_CLOSE(handle, fsp, fd);
-#else
-        retval = default_vfs_ops.close(fsp, fd);
-#endif
 
-        if ( !scan_on_close ) {
+        /* get the file name */
+        pstrcpy(filepath, fsp->conn->connectpath);
+        pstrcat(filepath, "/");
+        pstrcat(filepath, fsp->fsp_name);
+
+        if ( !vscan_config.common.scan_on_close ) {
                 DEBUG(3, ("samba-vscan - close: File '%s' not scanned as 
scan_on_close is not set\n", fsp->fsp_name));
-                return retval;
         }
-
-
-       /* get the file name */
-        pstrcpy(filepath, fsp->conn->connectpath);
-        pstrcat(filepath, "/"); 
-        pstrcat(filepath, fsp->fsp_name);        
-       
         /* Don't scan directorys */
-        if ( fsp->is_directory )
-            return retval;
-
-
-       if ( !fsp->modified ) {
-                if ( verbose_file_logging ) 
+        else if ( fsp->is_directory )
+               DEBUG(10, ("don't scan directory\n"));
+       /* Don't scan files which have not been modified */
+       else if ( !fsp->modified ) {
+                if ( vscan_config.common.verbose_file_logging ) 
                         vscan_syslog("INFO: file %s was not modified - not 
scanned", filepath);
 
-               return retval;
        }
-
+        /* dont' scan file which matches exclude regexp */
+        else if ( fileregexp_skipscan(filepath) == VSCAN_FR_SKIP_SCAN ) {
+                if ( vscan_config.common.verbose_file_logging )
+                        vscan_syslog("INFO: file '%s' not scanned as file is 
machted by exclude regexp", filepath);
+        }
        /* don't scan files which are in the list of exclude file types */
-       if ( filetype_skipscan(filepath) == 1 ) {
-                if ( verbose_file_logging )
-                        vscan_syslog("File '%s' not scanned as file type is on 
exclude list", filepath);
-               return retval;
+       else if ( filetype_skipscan(filepath) == VSCAN_FT_SKIP_SCAN ) {
+                if ( vscan_config.common.verbose_file_logging )
+                        vscan_syslog("INFO: File '%s' not scanned as file type 
is on exclude list", filepath);
        }
+       else if ( (SMB_VFS_NEXT_STAT(handle, handle->conn, fsp->fsp_name, 
&stat_buf)) != 0 ) {    /* an error occured */ 
+               if( errno == ENOENT) {
+                       if ( vscan_config.common.verbose_file_logging )
+                               vscan_syslog("INFO: File %s not found! Not 
scanned!", fsp->fsp_name);
+               } else {
+                       vscan_syslog("ERROR: File %s not readable or an error 
occured", fsp->fsp_name);
+               }
+       }
+       else {
 
+               /* scan only file, do nothing */        
 
-       /* scan only file, do nothing */        
+               sockfd = vscan_avastd_init();   
+               if ( sockfd >= 0 ) {
+                       safe_strcpy(client_ip, fsp->conn->client_address, 
CLIENT_IP_SIZE -1);
+                       rv = vscan_avastd_scanfile(sockfd, filepath, client_ip);
+                       vscan_avastd_end(sockfd);
+                       if ( rv == VSCAN_SCAN_VIRUS_FOUND ) {
+                               /* virus was found */
+                               rc = vscan_do_infected_file_action(handle, 
fsp->conn, filepath, vscan_config.common.quarantine_dir, 
vscan_config.common.quarantine_prefix, 
vscan_config.common.infected_file_action);
 
-       sockfd = vscan_avastd_init();   
-       if ( sockfd >= 0 ) {
-               safe_strcpy(client_ip, fsp->conn->client_address, 
CLIENT_IP_SIZE -1);
-               rv = vscan_avastd_scanfile(sockfd, filepath, client_ip);
-               vscan_avastd_end(sockfd);
-               if ( rv == 1 ) {
-                       /* virus was found */
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
-                       rc = vscan_do_infected_file_action(handle, fsp->conn, 
filepath, quarantine_dir, quarantine_prefix, infected_file_action);
-#else
-                       rc = vscan_do_infected_file_action(&default_vfs_ops, 
fsp->conn, filepath, quarantine_dir, quarantine_prefix, infected_file_action);
-#endif
-               }
+                               /* add/update file, mark file as infected! */
+                               lrufiles_add(filepath, stat_buf.st_mtime, True);
+                       }
+                       else if( rv == VSCAN_SCAN_OK ) {
+                               /* add/update file, mark file as clean! */
+                               lrufiles_add(filepath, stat_buf.st_mtime, 
False);
+                       }
+                       else {
+                               /* to be save, delete file from lrufiles */
+                               lrufiles_delete(filepath);
+                       } /* rv */
+               } /* sockfd */
+       } /* pre-scan contitions */
 
-       }
        return retval;
 }
 
-
-#if (SMB_VFS_INTERFACE_VERSION >= 6)
 /* Samba 3.0 */
 NTSTATUS init_module(void)
 {
@@ -571,100 +357,9 @@
                
        return ret;     
 }
-#else
-/* VFS initialisation function.  Return initialised vfs_ops structure
-   back to SAMBA. */
-#if SAMBA_VERSION_MAJOR==3
- /* Samba 3.0 alphaX */
- vfs_op_tuple *vfs_init(int *vfs_version, struct vfs_ops *def_vfs_ops,
-                       struct smb_vfs_handle_struct *vfs_handle)
-#else
- /* Samba 2.2.x */
- #if SAMBA_VERSION_RELEASE>=4   
-  /* Samba 2.2.4 */
-  struct vfs_ops *vfs_init(int *vfs_version, struct vfs_ops *def_vfs_ops)
- #elif SAMBA_VERSION_RELEASE==2
-  /* Samba 2.2.2 / Samba 2.2.3 !!! */
-  struct vfs_ops *vfs_init(int* Version, struct vfs_ops *ops)
- #elif SAMBA_VERSION_RELEASE==1
-  /* Samba 2.2.1 */
-  struct vfs_ops *vfs_module_init(int *vfs_version)
- #else
-  /* Samba 2.2.0 */
-  struct vfs_ops *vfs_init(int *vfs_version)
- #endif
-#endif
-{
-       #if SAMBA_VERSION_MAJOR!=3
-        #if SAMBA_VERSION_RELEASE>=4
-         /* Samba 2.2.4 */
-         struct vfs_ops tmp_ops;
-        #endif
-       #endif
-
-        openlog("smbd_"VSCAN_MODULE_STR, LOG_PID, SYSLOG_FACILITY);
-
-        #if SAMBA_VERSION_MAJOR==3
-         /* Samba 3.0 alphaX */
-         *vfs_version = SMB_VFS_INTERFACE_VERSION;
-         vscan_syslog("samba-vscan (%s) loaded (Samba 3.x), (c) by Rainer 
Link, OpenAntiVirus.org", module_id);
-        #else
-         /* Samba 2.2.x */
-         #if SAMBA_VERSION_RELEASE>=4
-          /* Samba 2.2.4 */
-          *vfs_version = SMB_VFS_INTERFACE_VERSION;
-          vscan_syslog("samba-vscan (%s) loaded (Samba >=2.2.4), (c) by Rainer 
Link, OpenAntiVirus.org", module_id);
-         #elif SAMBA_VERSION_RELEASE==2
-          /* Samba 2.2.2 / Samba 2.2.3 !!! */
-          *Version = SMB_VFS_INTERFACE_VERSION;
-          vscan_syslog("samba-vscan (%s) loaded (Samba 2.2.2/2.2.3), (c) by 
Rainer Link, OpenAntiVirus.org", module_id);
-         #else
-          /* Samba 2.2.1 / Samba 2.2.0 */
-          *vfs_version = SMB_VFS_INTERFACE_VERSION;
-          vscan_syslog("samba-vscan (%s) loaded (Samba 2.2.0/2.2.1), (c) by 
Rainer Link, OpenAntiVirus.org",
-               module_id);
-         #endif
-        #endif
-
 
-       #if SAMBA_VERSION_MAJOR==3
-         /* Samba 3.0 alphaX */
-        DEBUG(3, ("Initialising default vfs hooks\n"));
-         memcpy(&default_vfs_ops, def_vfs_ops, sizeof(struct vfs_ops));
-
-         /* Remember vfs_handle for further allocation and referencing of 
-           private information in vfs_handle->data
-         */
-        vscan_handle = vfs_handle;
-        return vscan_ops;
-        #else
-         /* Samba 2.2.x */
-        #if SAMBA_VERSION_RELEASE>=4
-         /* Samba 2.2.4 */
-
-         *vfs_version = SMB_VFS_INTERFACE_VERSION;
-         memcpy(&tmp_ops, def_vfs_ops, sizeof(struct vfs_ops));
-         tmp_ops.connect = vscan_connect;
-         tmp_ops.disconnect = vscan_disconnect;
-         tmp_ops.open = vscan_open;
-         tmp_ops.close = vscan_close;
-         memcpy(&vscan_ops, &tmp_ops, sizeof(struct vfs_ops));
-         return(&vscan_ops);
-
-        #else
-          /* Samba 2.2.3-2.2.0 */
-          return(&vscan_ops);
-        #endif
-       #endif
-}
-
-
-#if SAMBA_VERSION_MAJOR==3
 /* VFS finalization function */
 void vfs_done(connection_struct *conn)
 {
         DEBUG(3, ("Finalizing default vfs hooks\n"));
 }
-#endif
-
-#endif /* #if (SMB_VFS_INTERFACE_VERSION >= 6) */

Index: vscan-avastd_core.c
===================================================================
RCS file: /cvsroot/openantivirus/samba3-vscan/avast/vscan-avastd_core.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- vscan-avastd_core.c 29 Aug 2005 12:51:22 -0000      1.1
+++ vscan-avastd_core.c 2 Oct 2005 12:27:43 -0000       1.2
@@ -4,8 +4,8 @@
  * Copyright (C) Frantisek Mensik, 2005
  *               ALWIL Software
  *
- * base on the F-Prot Daemon module by
- * Copyright (C) Rainer Link, 2001-2003
+ * based on the F-Prot Daemon module by
+ * Copyright (C) Rainer Link, 2001-2005
  *               OpenAntiVirus.org 
<rainer-pBPPa8WU5k41Tgt60Rntydi2O/JbrIOy@xxxxxxxxxxxxxxxx>
  *
  * Credits to W. Richard Stevens - RIP
@@ -136,7 +136,7 @@
         fpin = fdopen(sockfd, "r");
         if ( fpin == NULL ) {
                 vscan_syslog("ERROR: Can not open stream for reading - %s", 
strerror(errno));
-                return -1;
+                return VSCAN_SCAN_ERROR;
         }
 
         fpout = fdopen(sockfd, "w");
@@ -144,7 +144,7 @@
                /* close fpin */
                fclose(fpin);
                 vscan_syslog("ERROR: Can not open stream for writing - %s", 
strerror(errno));
-                return -1;
+                return VSCAN_SCAN_ERROR;
         }
 
        /* read from socket-stream */
@@ -153,7 +153,7 @@
                fclose(fpin);
                fclose(fpout);
                vscan_syslog("ERROR: can not get result from avast! daemon");
-               return -1;
+               return VSCAN_SCAN_ERROR;
        }
 
        /* check for welcome string */
@@ -162,7 +162,7 @@
                fclose(fpin);
                fclose(fpout);
                vscan_syslog("ERROR: avast! daemon is not available");
-               return -1;
+               return VSCAN_SCAN_ERROR;
        }
 
        if ( verbose_file_logging )
@@ -182,7 +182,7 @@
                /* closing streams */
                fclose(fpout);
                fclose(fpin);
-               return -1;
+               return VSCAN_SCAN_ERROR;
        }
 
        /* hum, instead of flush()ing, use setvbuf to set to line-buffering? */
@@ -192,7 +192,7 @@
                fclose(fpout);
                fclose(fpin);
                /* better safe than sorry ... */
-               return -1;
+               return VSCAN_SCAN_ERROR;
         }
 
 
@@ -209,7 +209,7 @@
                                fclose(fpin);
                                fclose(fpout);
                                vscan_syslog("ERROR: file %s not found, not 
readable or an error occured", scan_file);
-                               return -1;
+                               return VSCAN_SCAN_ERROR;
                        } else {
                                /* ready for reading scanned file result */
                                receiving_data = True;
@@ -223,7 +223,7 @@
                                /* closing streams */
                                fclose(fpout);
                                fclose(fpin);
-                               return 1;
+                               return VSCAN_SCAN_VIRUS_FOUND;
                        } else if ( (str = strstr(recvline, "\t[E]\t" )) != 
NULL ) {
                                received_error = True;
                        }
@@ -236,7 +236,7 @@
                /* closing streams */
                fclose(fpout);
                fclose(fpin);
-               return -1;
+               return VSCAN_SCAN_ERROR;
          } else {
 
                /* OK */
@@ -248,8 +248,8 @@
        fclose(fpout);
        fclose(fpin);
 
-       if ( received_error == True ) return -2;
-       return 0;
+       if ( received_error == True ) return VSCAN_SCAN_MINOR_ERROR;
+       return VSCAN_SCAN_OK;
 }
 
 



-------------------------------------------------------
This SF.Net email is sponsored by:
Power Architecture Resource Center: Free content, downloads, discussions,
and more. http://solutions.newsforge.com/ibmarch.tmpl


<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

Recently Viewed:
qnx.openqnx.dev...    politics.lenini...    audio.emagic.ex...    tex.texinfo.gen...    handhelds.linux...    ietf.sipping/20...    lang.erlang.gen...    cygwin.talk/200...    yellowdog.gener...    mozilla.devel.l...    xfree86.newbie/...    openbsd.ports/2...    db.oracle.devel...    kde.kalyxo.deve...    user-groups.lin...    bbc.cvs/2003-04...    gnu.libtool.bug...    redhat.k12osn/2...    emulators.wine....    freebsd.devel.d...    search.xapian.g...    java.izpack.use...    network.mrtg.us...    windows.total-c...   
Home | blog view | USPTO Patent Archive | advertise | OSDir is an inevitable website. super tiny logo

Free Magazines

Cisco News
Receive a free quarterly e-newsletter with exclusive articles on how Cisco IT uses its own products and solutions to enable the business.
subscribe

Systems Management News, the newspaper for IT systems administration and data center managers! Each issue of Systems Management News is chock-full of news and analysis to help you understand what's happening in your field.
subscribe

The Enterprise Newsweekly eWeek is the essential technology information source for builders of e-business.
subscribe

Oracle Magazine Oracle Magazine contains technology strategy articles, sample code, tips, Oracle and partner news, how to articles for developers and DBAs, and more. Oracle (NASDAQ: ORCL) is the world's largest enterprise software company.
subscribe

Total Telecom Total Telecom is "The Economist of the communications industry".
subscribe