NAME
    Mail::ClamAV - Perl extension for the clamav virus scanner

SYNOPSIS
        use Mail::ClamAV qw/:all/;

        # $Mail::ClamAV::Error in numeric context return clamav's
        # error status code which corresponds to the constants which
        # can be exported
        my $c = new Mail::ClamAV("/path/to/directory/or/file")
            or die "Failed to load db: $Mail::ClamAV::Error (", 0+$Mail::;

        # You can get retdbdir() to get the database dir in
        # clamav's conf
        my $c = new Mail::ClamAV(retdbdir())
            or die "Failed to load db: $Mail::ClamAV::Error";

        # When database is loaded, you must create the proper trie with:
        $c->buildtrie;

        # check to see if we need to reload
        if ($c->statchkdir) {
            $c = new Mail::ClamAV(retdbdir());
            $c->buildtrie;
        }

        # Set some limits (only applies to scan())
        # Only relevant for archives
        $c->maxreclevel(4);
        $c->maxfiles(20);
        $c->maxfilesize(1024 * 1024 * 20); # 20 megs

        # Scan a buffer
        my $status = $c->scanbuff($buff);

        # Scan a filehandle (scandesc in clamav)
        # scan(FileHandle or path, Bitfield of options)
        my $status = $c->scan(FH, CL_ARCHIVE|CL_MAIL);

        # Scan a file (scanfile in clamav)
        my $status = $c->scan("/path/to/file.eml", CL_MAIL);

        # $status is an overloaded object
        die "Failed to scan: $status" unless $status;
        if ($status->virus) {
            print "Message is a virus: $status\n";
        }
        else {
            print "No virus found!\n";
        }

DESCRIPTION
    Clam AntiVirus is an anti-virus toolkit for UNIX
    <http://clamav.elektrapro.com/>. This module provide a simple interface
    to its C API.

  EXPORT
    None by default.

  Exportable constants
    Options for scanning.

    CL_MAIL
     enables mbox and Maildir scanning

     WARNING WARNING WARNING The MIME parsing in clamav is still beta
     quality code as of the time of this writing [Tue Feb 10 10:09:56 PST
     2004]. It will segfault with certain emails. This tested with current
     CVS of clamav.

    CL_ARCHIVE
     enables archive scanning

    CL_RAW
     disables archive scanning

    Status returns. These are the first item in the list returned by
    "scan()" and "scanbuff()" when put into numeric context

    CL_CLEAN
     no viruses found

    CL_VIRUS
     virus found, put the status in scalar context to see the type

     These are the error status codes which you can get by putting
     $Mail::ClamAV::Error in numeric context

    CL_EMAXREC
     Recursion limit exceeded.

    CL_EMAXSIZE
     File size limit exceeded.

    CL_EMAXFILES
     Files number limit exceeded.

    CL_ERAR
     RAR module failure.

    CL_EZIP
     Zip module failure.

    CL_EMALFZIP
     Malformed Zip detected.

    CL_EGZIP
     GZip module failure.

    CL_ETMPFILE
     Unable to create temporary file.

    CL_ETMPDIR
     Unable to create temporary directory.

    CL_EFSYNC
     Unable to synchronize file <-> disk.

    CL_EMEM
     Unable to allocate memory.

    CL_EOPEN
     Unable to open file or directory.

    CL_EMALFDB
     Malformed database.

    CL_EPATSHORT
     Too short pattern detected.

    CL_ENULLARG
     Null argument passed when initialized is required.

  Exportable functions
    These function can be exported either individually or using the :all
    export flags

    retdbdir
     This function returns the path to the database directory specified when
     clamav was compiled.

METHODS
  Settings
    NOTE These settings only apply to "scan()" and archives (CL_ARCHIVE).

    maxreclevel
     Sets the maximum recursion level [default 5].

    maxfiles
     Maximum number of files that will be scanned [default 1000].

    maxfilesize
     Maximum file size that will be scanned in bytes [default 10M].

  Scanning
    All of these methods return a status object. This object is overloaded
    to make things cleaner. In boolean context this will return false if
    there was an error. For example: my $status = $c->scan("foo.txt"); die
    "Error scanning: $status" unless $status;

    As you probably just noticed, $status in scalar context returns the
    error message. In addition to the overloading you just saw, $status has
    the following methods:

    errno
     The numeric value (if any) clamav returned.

    clean
     This will be true if the message was not a virus and an error did not
     occur.

    virus
     Returns true if the message is a virus.

    error
     Return the error message (if any). This is the same thing as quoting
     $status.

    count
     Returns the number of messages scanned. Only works with archives.

    scan(FileHandle or Path, Bitfield of options)
     "scan()" takes a FileHanle or path and passed the file descriptor for
     that off to clamav. The second argument is a bitfield of options,
     CL_MAIL, CL_ARCHIVE or CL_RAW "Exportable constants".

     This function returns the status object discussed earlier

    scanbuff($buff)
     scanbuff takes a raw buffer and scans it. No options are available for
     this function (it is assumed you already unarchived or de-MIMEed the
     buffer and that it is raw).

  Data Directory stats
    If the path passed into "new()" is a directory Mail::ClamAV will set
    things up to check for updated database files. Calling the
    "statchkdir()" will check the database directory to the stats we have in
    memory. If anything has changed true is returned, otherwise false.

    NOTE: trying to use "statchkdir()" when you passed in a database file
    instead of directory will produce a fatal error.

    "statchkdir()" is useful for long running daemons that need to check to
    see if it is time to reload the database. Reloading is simply getting a
    new Mail::ClamAV object and initializing it.

SEE ALSO
    The ClamAV API documentation
    <http://www.clamav.net/doc/html-0.65/node44.html>

AUTHOR
    Scott Beck <sbeck@gossamer-threads.com>

COPYRIGHT AND LICENSE
    Copyright (C) 2003 by Gossamer Threads Inc.
    <http://www.gossamer-threads.com>

    This library is free software; you can redistribute it and/or modify it
    under the same terms as Perl itself, either Perl version 5.8.1 or, at
    your option, any later version of Perl 5 you may have available.

