Step 3: Install ClamAV eCAP AdapterΒΆ
Checking downloaded files for viruses will be implemented using eCAP ClamAV adapter by Measurement Factory, see http://www.e-cap.org/downloads. To download and compile all required packages, run script 03_clamav.sh from core.redhat9 sub folder.
#!/bin/bash
# all packages are installed as root
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root" 1>&2
exit 1
fi
# install it
dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
# install clamav
dnf -y install gcc-c++ patch make tar
dnf -y install clamav clamav-update clamav-devel
# from now on every error is fatal
set -e
# download the sources
curl -O https://www.e-cap.org/archive/ecap_clamav_adapter-2.0.0.tar.gz
# unpack
tar -xvzf ecap_clamav_adapter-2.0.0.tar.gz
# patch the CL_SCAN_STDOPT error
patch ecap_clamav_adapter-2.0.0/src/ClamAv.cc < ClamAv.cc.patch
# change into working dir
pushd ecap_clamav_adapter-2.0.0
# configure, make and install
./configure && make && make install
# and revert back
popd
The following patch fixes CL_SCAN_STDOPT error, as indicated on https://bugs.launchpad.net/ecap/+bug/1813962
--- ClamAv.cc.old 2023-08-08 08:43:01.319301759 -0400
+++ ClamAv.cc 2023-08-08 08:45:04.093333050 -0400
@@ -44,8 +44,13 @@
// We assume that cl_*() functions used here are threadsafe.
const char *virname = 0;
- const int eScanResult = cl_scanfile(answer.fileName.c_str(), &virname, 0, engine, CL_SCAN_STDOPT);
+ static struct cl_scan_options options = {};
+ {
+ options.parse |= ~0; // enable all parsers
+ }
+ const int eScanResult = cl_scanfile(answer.fileName.c_str(), &virname, 0, engine, &options);
+
switch (eScanResult) {
case CL_CLEAN:
answer.statusCode = Answer::scClean;
@@ -58,7 +63,7 @@
default:
answer.statusCode = Answer::scError;
- answer.errorMsg = cl_strerror(eScanResult);
+ answer.errorMsg = cl_strerror(static_cast<cl_error_t>(eScanResult));
}
}
@@ -71,7 +76,7 @@
if (!initialized) {
const int ret = cl_init(CL_INIT_DEFAULT);
if (ret != CL_SUCCESS)
- Throw("Can't initialize libclamav: ", cl_strerror(ret));
+ Throw("Can't initialize libclamav: ", cl_strerror(static_cast<cl_error_t>(ret)));
initialized = true;
}
@@ -136,13 +141,13 @@
/* load all available databases from default directory */
int ret = cl_load(cl_retdbdir(), engine, &sigs, CL_DB_STDOPT);
if (ret != CL_SUCCESS)
- Throw("cl_load: ", cl_strerror(ret));
+ Throw("cl_load: ", cl_strerror(static_cast<cl_error_t>(ret)));
// printf("Loaded %u signatures from %s\n", sigs, cl_retdbdir());
// build engine
if ((ret = cl_engine_compile(engine)) != CL_SUCCESS)
- Throw("Database initialization error: ", cl_strerror(ret));;
+ Throw("Database initialization error: ", cl_strerror(static_cast<cl_error_t>(ret)));;
memset(&dbstat, 0, sizeof(struct cl_stat));
cl_statinidir(cl_retdbdir(), &dbstat);
Press Next to continue to Step 4.