The current implementation of --exclude (and --exclude-dir) performs the
pruning AFTER descending/scanning those files.
The problem for us is that one of the areas we scan is via NFS on a
NetApp filer, and upon finding the built-in .snapshot directory (which
holds daily read-only snapshots of this hiearchy), spends the next week
traversing 30+ copies of the same files. --exclude (and --exclude-dir)
doesn't help us as implemented.
Attached is a patch we've been using since 0.75 (this one against
0.86.2) that uses --exclude to prevent traversing into treewalk() if the
regexp is on the list. Thus if we specify "--exclude=.snapshot", that
directory (regardless where) is completely skipped, as well as our
quarantine area. Don't understand why --exclude-dir is needed at all
(this patch doesn't do anything with it, but could simply be tweaked to
use --exclude-dir for this particular section).
It would be desirable to have the functional equivalent of this in the
standard releases.
thanks and regards,
-ericb
--
Transmeta, Corporation
*** clamav-0.86.2/clamscan/treewalk.c.exclude Sun Jul 24 16:30:17 2005
--- clamav-0.86.2/clamscan/treewalk.c Wed Sep 14 11:29:30 2005
***************
*** 106,113 ****
/* stat the file */
if(lstat(fname, &statbuf) != -1) {
if(S_ISDIR(statbuf.st_mode) &&
!S_ISLNK(statbuf.st_mode) && recursion) {
! if(treewalk(fname, root, user, opt, limits,
options, depth) == 1)
scanret++;
} else {
if(S_ISREG(statbuf.st_mode))
--- 106,128 ----
/* stat the file */
if(lstat(fname, &statbuf) != -1) {
+ int excludedir = 0;
if(S_ISDIR(statbuf.st_mode) &&
!S_ISLNK(statbuf.st_mode) && recursion) {
! /* see if this directory is on exclude list */
! if(optl(opt, "exclude")) {
! struct optnode *optnode;
! char *argument = getfirstargl(opt, "exclude",
&optnode);
! while (argument) {
! if(match_regex(fname, argument) == 1) {
! if(!printinfected)
! mprintf("%s: directory
excluded.\n", fname);
! excludedir = 1;
! }
! argument = getnextargl(&optnode, "exclude");
! }
! }
!
! if(!excludedir && treewalk(fname, root, user, opt,
limits, options, depth) == 1)
scanret++;
} else {
if(S_ISREG(statbuf.st_mode))
_______________________________________________
http://lurker.clamav.net/list/clamav-devel.html