git: e761728685b1 - main - security/clamav-lts: Add new port

From: Yasuhiro Kimura <yasu_at_FreeBSD.org>
Date: Thu, 07 Oct 2021 08:53:31 UTC
The branch main has been updated by yasu:

URL: https://cgit.FreeBSD.org/ports/commit/?id=e761728685b12571bdf0a8a20d4506c8c58f934c

commit e761728685b12571bdf0a8a20d4506c8c58f934c
Author:     Yasuhiro Kimura <yasu@FreeBSD.org>
AuthorDate: 2021-09-18 08:44:56 +0000
Commit:     Yasuhiro Kimura <yasu@FreeBSD.org>
CommitDate: 2021-10-07 08:52:06 +0000

    security/clamav-lts: Add new port
    
    * Add Long Term Support release of ClamAV
    * Add CONFLICTS_INSTALL to security/clamav
    * Add entry to UPDATING that explains
      - Upstream changed their end-of-life policy and LTS release is
        introduced
      - How to switch from regular release (security/clamav) to LTS
        release (security/clamav-lts)
    
    Note about setting PORTEPOCH
    
    In general new port should not set PORTEPOCH. But in this case it
    should be set with following reason.
    
    1. Recently upstream changed their end-of-life policy as following.
      - Regular feature release (= 0.xyz.0 release) is released more
        frequently, and life time of each feature release is shortened to
        about 4 months.
      - To compensate for the short lifetime of regular feature release,
        Long Term Support feature release is introduced and its life time
        is about 3 years.
    2. First LTS starts with version 0.103.3 and it is same as current
       version of security/clamav.
    3. Because of short lifetime of regular feature release, it is
       probable that not a few users of security/clamav want to switch to
       security/clamav-lts after the latter is connected (and the former
       is updated to 0.104.0).
    3. For such users the entry is added to UPDATING about how to switch
       from security/clamav to security/clamav-lts. And binary package
       user is suggested to execute
       `pkg set -o security/clamav:security/clamav-lts`. This command
       changes the origin of already installed clamav packages. So user
       can switch to LTS version without reinstalling.
    4. But if PORTEPOCH isn't set in security/clamav-lts, binary package
       user who executed above command will notice that version of
       installed package (0.103.3,1) succeeds to current version of
       security/clamav-lts (0.103.3). The situation doesn't change after
       new patch release (0.103.4 for example) is released and it causes
       the problem that installed package isn't properly upgraded with
       `pkg upgrade`.
    5. So PORTEPOCH is set in  security/clamav-lts to prevent binary
       package user from suffering from such problem.
---
 UPDATING                                           |  28 ++++
 security/Makefile                                  |   1 +
 security/clamav-lts/Makefile                       | 179 +++++++++++++++++++++
 security/clamav-lts/distinfo                       |   3 +
 security/clamav-lts/files/clamav-clamd.in          |  51 ++++++
 security/clamav-lts/files/clamav-freshclam.in      |  45 ++++++
 security/clamav-lts/files/clamav-milter.in         | 101 ++++++++++++
 .../clamav-lts/files/extra-patch-shared_output.c   |  17 ++
 ...h-libclamav_c++_llvm_include_llvm_Support_CFG.h |  62 +++++++
 security/clamav-lts/files/pkg-deinstall.in         |  25 +++
 security/clamav-lts/pkg-descr                      |   8 +
 security/clamav-lts/pkg-plist                      |  81 ++++++++++
 security/clamav/Makefile                           |   2 +
 13 files changed, 603 insertions(+)

diff --git a/UPDATING b/UPDATING
index 7aa749aafd2e..509879b0cdd4 100644
--- a/UPDATING
+++ b/UPDATING
@@ -5,6 +5,34 @@ they are unavoidable.
 You should get into the habit of checking this file for changes each time
 you update your ports collection, before attempting any port upgrades.
 
+20211007:
+  AFFECTS: user of security/clamav
+  AUTHOR: yasu@FreeBSD.org
+
+  Upstream changed end-of-life policy and introduced long time support
+  (LTS) feature release.
+
+  * LTS feature release will be identified approximately every two
+    years and supported for at least three years from the initial
+    publication date of that LTS feature version.
+  * Regular (non-LTS) feature releases will be supported for at least
+    four months from the initial publication date of the next feature
+    release or until the feature release after that is published.
+
+  According to it new port security/clamav-lts is added for users who
+  want to use LTS version of ClamAV.
+
+  Users wanting to switch to LTS version can replace security/clamav
+  with security/clamav-lts with one of following commands.
+
+  If you use pkg with binary packages:
+    # pkg set -o security/clamav:security/clamav-lts
+    # pkg upgrade
+  If you use portmaster:
+    # portmaster -o security/clamav-lts security/clamav
+  If you use portupgrade:
+    # portupgrade -o security/clamav-lts security/clamav
+
 20211006:
 AFFECTS: users of misc/freebsd-doc-*
 AUTHOR: blackend@FreeBSD.org
diff --git a/security/Makefile b/security/Makefile
index 98f6bbbffe3c..ca6e5b123dbc 100644
--- a/security/Makefile
+++ b/security/Makefile
@@ -88,6 +88,7 @@
     SUBDIR += cl-md5-sbcl
     SUBDIR += clamassassin
     SUBDIR += clamav
+    SUBDIR += clamav-lts
     SUBDIR += clamav-unofficial-sigs
     SUBDIR += clamd-stream-client
     SUBDIR += clamfs
diff --git a/security/clamav-lts/Makefile b/security/clamav-lts/Makefile
new file mode 100644
index 000000000000..679807a965f5
--- /dev/null
+++ b/security/clamav-lts/Makefile
@@ -0,0 +1,179 @@
+PORTNAME=	clamav
+PORTVERSION=	0.103.3
+PORTEPOCH=	1
+CATEGORIES=	security
+MASTER_SITES=	https://www.clamav.net/downloads/production/
+PKGNAMESUFFIX=	-lts
+
+MAINTAINER=	yasu@FreeBSD.org
+COMMENT=	Command line virus scanner written entirely in C
+
+LICENSE=	GPLv2
+LICENSE_FILE=	${WRKSRC}/COPYING
+
+LIB_DEPENDS=	libcurl.so:ftp/curl \
+		libltdl.so:devel/libltdl \
+		libmspack.so:archivers/libmspack
+
+USES=		compiler cpe gmake gnome libtool ncurses pathfix pkgconfig ssl
+USE_LDCONFIG=	yes
+USE_RC_SUBR=	clamav-clamd clamav-freshclam
+
+GNU_CONFIGURE=	yes
+CONFIGURE_ARGS=	--disable-dependency-tracking \
+		--enable-bigstack \
+		--enable-clamdtop \
+		--libdir=${PREFIX}/lib \
+		--with-dbdir=${DBDIR} \
+		--with-libcurl=${LOCALBASE} \
+		--with-openssl=${OPENSSLBASE} \
+		--with-system-libmspack=${LOCALBASE}/lib/libmspack.so
+
+INSTALL_TARGET=	install-strip
+CFLAGS_i386=	-march=i486
+# This port has a problem with -pthread,
+# force to use -lthr until it's not fixed.
+LDFLAGS+=	-lthr
+
+CONFLICTS_INSTALL=	clamav-[0-9]*
+
+SUB_FILES=	pkg-deinstall
+SUB_LIST+=	CHMOD=${CHMOD} \
+		CHOWN=${CHOWN} \
+		CLAMAV_CLAMD_PIDFILE=${CLAMAV_CLAMD_PIDFILE} \
+		CLAMAV_CLAMD_SOCKET=${CLAMAV_CLAMD_SOCKET} \
+		CLAMAV_MILTER_SOCKET=${CLAMAV_MILTER_SOCKET} \
+		CLAMAVGROUP=${CLAMAVGROUP} \
+		CLAMAVUSER=${CLAMAVUSER} \
+		DBDIR=${DBDIR} \
+		LOGDIR=${LOGDIR} \
+		RUNDIR=${RUNDIR}
+
+CLAMAVUSER?=	clamav
+CLAMAVGROUP?=	clamav
+
+.if ${CLAMAVUSER} == "clamav"
+USERS=		clamav
+.endif
+
+.if ${CLAMAVGROUP} == "clamav"
+GROUPS=		clamav mail
+.endif
+
+PLIST_SUB+=	CLAMAVGROUP=${CLAMAVGROUP} \
+		CLAMAVUSER=${CLAMAVUSER} \
+		DBDIR=${DBDIR} \
+		LOGDIR=${LOGDIR} \
+		RUNDIR=${RUNDIR}
+
+OPTIONS_DEFINE=	ARC ARJ DMG_XAR DOCS EXPERIMENTAL ICONV IPV6 JSON LDAP LHA \
+		MILTER PCRE STDERR TESTS UNRAR UNZOO
+
+OPTIONS_DEFAULT=	ARC ARJ DMG_XAR JSON MILTER PCRE UNRAR UNZOO
+OPTIONS_SUB=		yes
+
+ARC_DESC=		Enable arch archives support
+ARJ_DESC=		Enable arj archives support
+DMG_XAR_DESC=		Enable DMG and XAR archives support
+EXPERIMENTAL_DESC=	Build experimental code
+LHA_DESC=		Enable lha archives support
+MILTER_DESC=		Compile the milter interface
+STDERR_DESC=		Print logs to stderr instead of stdout
+TESTS_DESC=		Run compile-time tests (req. python)
+UNZOO_DESC=		Enable zoo archives support
+
+ARC_RUN_DEPENDS=		arc:archivers/arc
+ARJ_RUN_DEPENDS=		arj:archivers/arj
+DMG_XAR_USE=			GNOME=libxml2
+DMG_XAR_CONFIGURE_WITH=		xml=${LOCALBASE}
+EXPERIMENTAL_CONFIGURE_ENABLE=	experimental
+ICONV_USES=			iconv
+ICONV_CONFIGURE_WITH=		iconv
+IPV6_CONFIGURE_ENABLE=		ipv6
+JSON_LIB_DEPENDS=		libjson-c.so:devel/json-c
+JSON_CONFIGURE_WITH=		libjson=${LOCALBASE}
+LDAP_USE=			OPENLDAP=yes
+LDAP_LDFLAGS=			-lldap -L${LOCALBASE}/lib
+LHA_RUN_DEPENDS=		lha:archivers/lha
+.if !exists(/usr/lib/libmilter.so)
+MILTER_LIB_DEPENDS+=		libmilter.so:mail/libmilter
+.endif
+MILTER_USE=			RC_SUBR=clamav-milter
+MILTER_CONFIGURE_ENABLE=	milter
+MILTER_CONFIGURE_WITH=		sendmail=/usr/sbin/sendmail
+.if !exists(/usr/lib/libmilter.so)
+MILTER_CFLAGS=			-I${LOCALBASE}/include
+MILTER_LDFLAGS=			-L${LOCALBASE}/lib
+.endif
+PCRE_LIB_DEPENDS=		libpcre2-8.so:devel/pcre2
+PCRE_CONFIGURE_WITH=		pcre
+STDERR_EXTRA_PATCHES=		${FILESDIR}/extra-patch-shared_output.c
+TESTS_BUILD_DEPENDS=		${LOCALBASE}/include/check.h:devel/check
+TESTS_USES=			python:build
+TESTS_CONFIGURE_ENABLE=		check
+UNRAR_CONFIGURE_ENABLE=		unrar
+UNZOO_RUN_DEPENDS=		unzoo:archivers/unzoo
+
+CLAMAV_CLAMD_SOCKET?=	${RUNDIR}/clamd.sock
+CLAMAV_CLAMD_PIDFILE?=	${RUNDIR}/clamd.pid
+CLAMAV_MILTER_SOCKET?=	${RUNDIR}/clmilter.sock
+
+DBDIR=		/var/db/clamav
+LOGDIR=		/var/log/clamav
+RUNDIR=		/var/run/clamav
+PY_NO_THREAD=	${WRKDIR}/.python-has-no-threads
+
+SED_CONF=	-E -e 's|^\#?(Example)$$|\#\1|' -e \
+		's|^\#?((Update)?LogFile) .*/([a-z]+\.log)$$|\1 ${LOGDIR}/\3|' \
+		-e 's|^\#?(PidFile) .*/([a-z\-]+\.pid)$$|\1 ${RUNDIR}/\2|' -e \
+		's|^\#?(LocalSocket) .*$$|\1 ${CLAMAV_CLAMD_SOCKET}|' -e \
+		's|^\#?(User) .*$$|\1 ${CLAMAVUSER}|' -e \
+		's|^\#?(AllowSupplementaryGroups).*$$|\1 yes|' -e \
+		's|^\#?(ScanMail).*$$|\1 yes|' -e \
+		's|^\#?(DatabaseDirectory) .*$$|\1 ${DBDIR}|' -e \
+		's|^\#?(DatabaseOwner) .*$$|\1 ${CLAMAVUSER}|' -e \
+		's|^\#?(FixStaleSocket).*$$|\1 yes|' -e \
+		's|^\#?(NotifyClamd) .*$$|\1 ${PREFIX}/etc/clamd.conf|' -e \
+		's|^\#?(MilterSocket) */tmp.*$$|\1 ${CLAMAV_MILTER_SOCKET}|' -e \
+		's|^\#?(ClamdSocket).*$$|\1 unix:${CLAMAV_CLAMD_SOCKET}|'
+
+.include <bsd.port.pre.mk>
+
+post-patch:
+	@${REINPLACE_CMD} ${SED_CONF} \
+		${WRKSRC}/etc/clamd.conf.sample \
+		${WRKSRC}/etc/freshclam.conf.sample \
+		${WRKSRC}/etc/clamav-milter.conf.sample
+.if ${CHOSEN_COMPILER_TYPE} == gcc
+	@${REINPLACE_CMD} -e 's|-Wno-logical-op-parentheses||' \
+			  -e 's|-Wno-dangling-else||' \
+		${WRKSRC}/libclamav/Makefile.am \
+		${WRKSRC}/libclamav/Makefile.in \
+		${WRKSRC}/libclamunrar/makefile
+.endif
+
+pre-configure-TESTS-on:
+	@if ! ${PYTHON_CMD} -c "import thread" >/dev/null 2>&1; then \
+		${ECHO_MSG} ""; \
+		${ECHO_MSG} "==========================================================================="; \
+		${ECHO_MSG} "= Unit tests REQUIRES python built with thread support, and yours is not. ="; \
+		${ECHO_MSG} "= It will not be called during this build                                 ="; \
+		${ECHO_MSG} "==========================================================================="; \
+		${ECHO_MSG} ""; \
+		${TOUCH} ${PY_NO_THREAD}; \
+	fi
+
+post-build-TESTS-on:
+	@if [ ! -f "${PY_NO_THREAD}" ]; then \
+		${MAKE_CMD} -C ${WRKSRC} check; \
+	fi
+
+post-install:
+	${INSTALL_DATA} ${WRKSRC}/clamav-config.h ${STAGEDIR}${PREFIX}/include
+	@${MKDIR} ${STAGEDIR}${DOCSDIR}/html \
+		  ${STAGEDIR}${DBDIR} \
+		  ${STAGEDIR}${LOGDIR} \
+		  ${STAGEDIR}${RUNDIR}
+	(cd ${WRKSRC}/docs/html; ${COPYTREE_SHARE} . ${STAGEDIR}${DOCSDIR}/html)
+
+.include <bsd.port.post.mk>
diff --git a/security/clamav-lts/distinfo b/security/clamav-lts/distinfo
new file mode 100644
index 000000000000..808efe68f12a
--- /dev/null
+++ b/security/clamav-lts/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1624295813
+SHA256 (clamav-0.103.3.tar.gz) = 9f6e3d18449f3d1a3992771d696685249dfa12736fe2b2929858f2c7d8276ae9
+SIZE (clamav-0.103.3.tar.gz) = 13389239
diff --git a/security/clamav-lts/files/clamav-clamd.in b/security/clamav-lts/files/clamav-clamd.in
new file mode 100644
index 000000000000..b9c562f47987
--- /dev/null
+++ b/security/clamav-lts/files/clamav-clamd.in
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+# PROVIDE: clamav_clamd
+# REQUIRE: LOGIN
+# BEFORE: mail
+# KEYWORD: shutdown
+
+#
+# Add the following lines to /etc/rc.conf to enable clamd:
+#
+# clamav_clamd_enable="YES"
+# clamav_clamd_flags="<set as needed>"
+#
+# See clamd(8) for flags
+#
+
+. /etc/rc.subr
+
+name=clamav_clamd
+rcvar=clamav_clamd_enable
+
+# read settings, set default values
+load_rc_config "$name"
+
+: ${clamav_clamd_enable:=NO}
+: ${clamav_clamd_socket="%%CLAMAV_CLAMD_SOCKET%%"}
+: ${clamav_clamd_pidfile="%%CLAMAV_CLAMD_PIDFILE%%"}
+: ${clamav_clamd_user="%%CLAMAVUSER%%"}
+
+command=%%PREFIX%%/sbin/clamd
+required_dirs=%%DBDIR%%
+required_files=%%PREFIX%%/etc/clamd.conf
+
+start_precmd=clamav_clamd_precmd
+extra_commands=reload
+reload_cmd="%%PREFIX%%/bin/clamdscan --reload"
+
+#clamav .93 won't start without a valid main.c[vl]d file
+clamav_clamd_precmd()
+{
+	local rundir=${clamav_clamd_pidfile%/*}
+	if [ ! -d $rundir ] ; then
+		install -d -m 0755 -o ${clamav_clamd_user} -g ${clamav_clamd_user} $rundir
+	fi
+	if [ ! -f %%DBDIR%%/main.cvd -a ! -f %%DBDIR%%/main.cld ];then
+		echo "Missing %%DBDIR%%/*.cvd or *.cld files.  You must run freshclam first"
+		exit 1
+	fi
+}
+
+run_rc_command "$1"
diff --git a/security/clamav-lts/files/clamav-freshclam.in b/security/clamav-lts/files/clamav-freshclam.in
new file mode 100644
index 000000000000..affd41e1c6a3
--- /dev/null
+++ b/security/clamav-lts/files/clamav-freshclam.in
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+# PROVIDE: clamav_freshclam
+# REQUIRE: LOGIN clamav_clamd
+# BEFORE: mail
+# KEYWORD: shutdown
+
+#
+# Add the following lines to /etc/rc.conf to enable the freshclam daemon:
+#
+# clamav_freshclam_enable="YES"
+# clamav_freshclam_flags="<set as needed>"
+#
+# See freshclam(1) for flags
+#
+
+. /etc/rc.subr
+
+name=clamav_freshclam
+rcvar=clamav_freshclam_enable
+
+# read settings, set default values
+load_rc_config ${name}
+
+: ${clamav_freshclam_enable:=NO}
+: ${clamav_freshclam_pidfile=%%RUNDIR%%/freshclam.pid}
+: ${clamav_freshclam_user=%%CLAMAVUSER%%}
+
+command=%%PREFIX%%/bin/freshclam
+pidfile=${clamav_freshclam_pidfile}
+command_args="--daemon -p ${pidfile}"
+required_dirs=%%DBDIR%%
+required_files=%%PREFIX%%/etc/freshclam.conf
+
+start_precmd=clamav_freshclam_precmd
+
+clamav_freshclam_precmd()
+{
+	local rundir=${clamav_freshclam_pidfile%/*}
+	if [ ! -d $rundir ] ; then
+		install -d -m 0755 -o ${clamav_freshclam_user} -g ${clamav_freshclam_user} $rundir
+	fi
+}
+
+run_rc_command "$1"
diff --git a/security/clamav-lts/files/clamav-milter.in b/security/clamav-lts/files/clamav-milter.in
new file mode 100644
index 000000000000..ab540d9034ff
--- /dev/null
+++ b/security/clamav-lts/files/clamav-milter.in
@@ -0,0 +1,101 @@
+#!/bin/sh
+
+# PROVIDE: clamav_milter
+# REQUIRE: LOGIN clamav_clamd
+# BEFORE: mail
+# KEYWORD: shutdown
+
+#
+# Add the following lines to /etc/rc.conf to enable clamav-milter:
+#
+# clamav_milter_enable="YES"
+#
+# See clamav-milter(1) for flags
+#
+
+. /etc/rc.subr
+
+name=clamav_milter
+rcvar=clamav_milter_enable
+
+load_rc_config $name
+
+: ${clamav_milter_enable:=NO}
+: ${clamav_milter_socket="%%CLAMAV_MILTER_SOCKET%%"}
+: ${clamav_milter_conf="%%PREFIX%%/etc/clamav-milter.conf"}
+: ${clamav_milter_flags="-c ${clamav_milter_conf}"}
+: ${clamav_milter_socktimeout=60}
+: ${clamav_milter_socket_mode=777}
+: ${clamav_milter_socket_user=%%CLAMAVUSER%%}
+: ${clamav_milter_socket_group=%%CLAMAVGROUP%%}
+: ${clamav_clamd_enable:=NO}
+: ${clamav_clamd_socket="%%CLAMAV_CLAMD_SOCKET%%"}
+
+command=%%PREFIX%%/sbin/clamav-milter
+required_dirs=%%DBDIR%%
+required_files=${clamav_milter_conf}
+
+start_precmd=start_precmd
+start_postcmd=start_postcmd
+
+start_precmd()
+{
+	if [ -S "$clamav_milter_socket" ]; then
+		warn "Stale socket $clamav_milter_socket removed."
+		rm "$clamav_milter_socket"
+	fi
+	rc_flags="${flags:-$clamav_milter_flags}"
+
+	clamav_clamd_socket_prefix=${clamav_clamd_socket%:*}
+	# We can have inet or inet6, try to remove 6
+	clamav_clamd_socket_prefix=${clamav_clamd_socket_prefix%6}
+	
+	if checkyesno clamav_clamd_enable && [ "x$clamav_clamd_socket" != "x" -a "${clamav_clamd_socket_prefix}" != "inet" ]; then
+		echo -n "Waiting for clamd socket.. "
+		i=${clamav_milter_socktimeout}
+		while [ $i -ne 0 ]
+		do
+			[ -S "$clamav_clamd_socket" ] && break
+			if [ `expr $i % 10` -eq 0 ]; then
+				echo -n "${i}.. "
+			fi
+			sleep 1
+			i=$(($i-1))
+		done
+		echo
+		if [ $i -eq 0 ]; then
+			echo "There is no clamd socket (${clamav_clamd_socket})!"
+			exit 1
+		fi
+	fi
+}
+
+start_postcmd()
+{
+	clamav_milter_socket_prefix=${clamav_milter_socket%:*}
+	# We can have inet or inet6, try to remove 6
+	clamav_milter_socket_prefix=${clamav_milter_socket_prefix%6}
+	
+	if [ "x$clamav_milter_socket" != "x" -a "${clamav_milter_socket_prefix}" != "inet" ]; then
+		echo -n "Waiting for clamav-milter socket.. "
+		i=${clamav_milter_socktimeout}
+		while [ $i -ne 0 ]
+		do
+			[ -S "$clamav_milter_socket" ] && break
+			if [ `expr $i % 10` -eq 0 ]; then
+				echo -n "${i}.. "
+			fi
+			sleep 1
+			i=$(($i-1))
+		done
+		echo
+		if [ $i -eq 0 ]; then
+			echo "There is no clamav-milter socket (${clamav_milter_socket})!"
+			exit 1
+		fi
+		%%CHMOD%% ${clamav_milter_socket_mode} ${clamav_milter_socket}
+		%%CHOWN%% ${clamav_milter_socket_user}:${clamav_milter_socket_group} ${clamav_milter_socket}
+	fi
+}
+
+run_rc_command "$1"
diff --git a/security/clamav-lts/files/extra-patch-shared_output.c b/security/clamav-lts/files/extra-patch-shared_output.c
new file mode 100644
index 000000000000..ddb4ab029f38
--- /dev/null
+++ b/security/clamav-lts/files/extra-patch-shared_output.c
@@ -0,0 +1,17 @@
+--- shared/output.c.orig	Thu May 18 22:10:40 2006
++++ shared/output.c	Thu May 18 22:12:43 2006
+@@ -236,7 +236,13 @@
+ 	return;
+     }
+ 
+-    fd = stdout;
++/*    fd = stdout; (missing flag 'mprintf_stdout') --eh.  */
++
++     if(mprintf_stdout)
++         fd = stdout;
++     else
++         fd = stderr;
++
+ 
+ /* legend:
+  * ! - error
diff --git a/security/clamav-lts/files/patch-libclamav_c++_llvm_include_llvm_Support_CFG.h b/security/clamav-lts/files/patch-libclamav_c++_llvm_include_llvm_Support_CFG.h
new file mode 100644
index 000000000000..dd70c2ca4d20
--- /dev/null
+++ b/security/clamav-lts/files/patch-libclamav_c++_llvm_include_llvm_Support_CFG.h
@@ -0,0 +1,62 @@
+--- libclamav/c++/llvm/include/llvm/Support/CFG.h.orig	2016-04-22 15:02:19 UTC
++++ libclamav/c++/llvm/include/llvm/Support/CFG.h
+@@ -27,8 +27,9 @@ namespace llvm {
+ 
+ template <class Ptr, class USE_iterator> // Predecessor Iterator
+ class PredIterator : public std::iterator<std::forward_iterator_tag,
+-                                          Ptr, ptrdiff_t> {
+-  typedef std::iterator<std::forward_iterator_tag, Ptr, ptrdiff_t> super;
++                                          Ptr, ptrdiff_t, Ptr*, Ptr*> {
++  typedef std::iterator<std::forward_iterator_tag, Ptr, ptrdiff_t, Ptr*,
++                                                                    Ptr*> super;
+   typedef PredIterator<Ptr, USE_iterator> Self;
+   USE_iterator It;
+ 
+@@ -40,6 +41,7 @@ class PredIterator : public std::iterator<std::forward
+ 
+ public:
+   typedef typename super::pointer pointer;
++  typedef typename super::reference reference;
+ 
+   explicit inline PredIterator(Ptr *bb) : It(bb->use_begin()) {
+     advancePastNonTerminators();
+@@ -49,7 +51,7 @@ class PredIterator : public std::iterator<std::forward
+   inline bool operator==(const Self& x) const { return It == x.It; }
+   inline bool operator!=(const Self& x) const { return !operator==(x); }
+ 
+-  inline pointer operator*() const {
++  inline reference operator*() const {
+     assert(!It.atEnd() && "pred_iterator out of range!");
+     return cast<TerminatorInst>(*It)->getParent();
+   }
+@@ -87,10 +89,11 @@ inline const_pred_iterator pred_end(const BasicBlock *
+ 
+ template <class Term_, class BB_>           // Successor Iterator
+ class SuccIterator : public std::iterator<std::bidirectional_iterator_tag,
+-                                          BB_, ptrdiff_t> {
++                                          BB_, ptrdiff_t, BB_*, BB_*> {
+   const Term_ Term;
+   unsigned idx;
+-  typedef std::iterator<std::bidirectional_iterator_tag, BB_, ptrdiff_t> super;
++  typedef std::iterator<std::bidirectional_iterator_tag, BB_, ptrdiff_t, BB_*,
++                                                                    BB_*> super;
+   typedef SuccIterator<Term_, BB_> Self;
+ 
+   inline bool index_is_valid(int idx) {
+@@ -99,6 +102,7 @@ class SuccIterator : public std::iterator<std::bidirec
+ 
+ public:
+   typedef typename super::pointer pointer;
++  typedef typename super::reference reference;
+   // TODO: This can be random access iterator, only operator[] missing.
+ 
+   explicit inline SuccIterator(Term_ T) : Term(T), idx(0) {// begin iterator
+@@ -122,7 +126,7 @@ class SuccIterator : public std::iterator<std::bidirec
+   inline bool operator==(const Self& x) const { return idx == x.idx; }
+   inline bool operator!=(const Self& x) const { return !operator==(x); }
+ 
+-  inline pointer operator*() const { return Term->getSuccessor(idx); }
++  inline reference operator*() const { return Term->getSuccessor(idx); }
+   inline pointer operator->() const { return operator*(); }
+ 
+   inline Self& operator++() { ++idx; return *this; } // Preincrement
diff --git a/security/clamav-lts/files/pkg-deinstall.in b/security/clamav-lts/files/pkg-deinstall.in
new file mode 100644
index 000000000000..47b5c7f8abf3
--- /dev/null
+++ b/security/clamav-lts/files/pkg-deinstall.in
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+if [ "$2" != "POST-DEINSTALL" ]; then
+	exit 0
+fi
+
+CLAMAVUSER=%%CLAMAVUSER%%
+
+echo
+echo "===================================================="
+echo
+echo "If you want remove clamav permanently from you system"
+echo "execute following commands:"
+echo
+echo " # rm -rf %%LOGDIR%%"
+echo " # rm -rf %%RUNDIR%%"
+echo " # rm -rf %%DBDIR%%"
+if pw usershow "${CLAMAVUSER}" 2>/dev/null 1>&2; then
+	echo " # pw userdel ${CLAMAVUSER}"
+fi
+echo
+echo "===================================================="
+echo
+
+exit 0
diff --git a/security/clamav-lts/pkg-descr b/security/clamav-lts/pkg-descr
new file mode 100644
index 000000000000..541af4c17b4b
--- /dev/null
+++ b/security/clamav-lts/pkg-descr
@@ -0,0 +1,8 @@
+This the Long Term Support (LTS) version of Clam Antivirus.
+Clam Antivirus is command line virus scanner written entirely in C
+and its database is kept up to date. It also detects polymorphic
+viruses, scans compressed files and supported by AMaViS.
+Optionally you can use the clamav-milter interface to connect
+clamav with sendmail.
+
+WWW: https://www.clamav.net/
diff --git a/security/clamav-lts/pkg-plist b/security/clamav-lts/pkg-plist
new file mode 100644
index 000000000000..726d7d1722df
--- /dev/null
+++ b/security/clamav-lts/pkg-plist
@@ -0,0 +1,81 @@
+bin/clamav-config
+bin/clambc
+bin/clamconf
+bin/clamdscan
+bin/clamdtop
+bin/clamscan
+%%JSON%%bin/clamsubmit
+bin/freshclam
+bin/sigtool
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Contribute.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Installation-Unix.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Installation-Unix/Steps-Debian-Ubuntu.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Installation-Unix/Steps-Redhat-CentOS.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Installation-Unix/Steps-macOS.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Installation-Windows.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Introduction.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/OnAccess.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/AllowLists.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/AuthenticodeRules.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/BodySignatureFormat.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/BytecodeSignatures.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/ContainerMetadata.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/DatabaseInfo.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/DynamicConfig.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/EncryptedArchives.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/ExtendedSignatures.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/FileTypeMagic.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/FileTypes.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/FunctionalityLevels.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/HashSignatures.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/LogicalSignatures.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/PhishSigs.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Signatures/YaraRules.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Usage.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Usage/Configuration.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Usage/Scanning.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/Usage/SignatureManagement.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/development.html
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/images/demon.png
+%%PORTDOCS%%%%DOCSDIR%%/html/UserManual/libclamav.html
+include/clamav-config.h
+include/clamav-types.h
+include/clamav-version.h
+include/clamav.h
+include/libfreshclam.h
+lib/libclamav.so
+lib/libclamav.so.9
+lib/libclamav.so.9.0.5
+%%UNRAR%%lib/libclamunrar.so
+%%UNRAR%%lib/libclamunrar.so.9
+%%UNRAR%%lib/libclamunrar.so.9.0.5
+%%UNRAR%%lib/libclamunrar_iface.so
+%%UNRAR%%lib/libclamunrar_iface.so.9
+%%UNRAR%%lib/libclamunrar_iface.so.9.0.5
+lib/libfreshclam.so
+lib/libfreshclam.so.2
+lib/libfreshclam.so.2.0.1
+libdata/pkgconfig/libclamav.pc
+man/man1/clambc.1.gz
+man/man1/clamconf.1.gz
+man/man1/clamdscan.1.gz
+man/man1/clamdtop.1.gz
+man/man1/clamscan.1.gz
+%%JSON%%man/man1/clamsubmit.1.gz
+man/man1/freshclam.1.gz
+man/man1/sigtool.1.gz
+man/man5/clamav-milter.conf.5.gz
+man/man5/clamd.conf.5.gz
+man/man5/freshclam.conf.5.gz
+man/man8/clamav-milter.8.gz
+man/man8/clamd.8.gz
+%%MILTER%%sbin/clamav-milter
+sbin/clamd
+@sample etc/clamd.conf.sample
+%%MILTER%%@sample etc/clamav-milter.conf.sample
+@sample etc/freshclam.conf.sample
+@dir(%%CLAMAVUSER%%,%%CLAMAVGROUP%%,0755) %%DBDIR%%
+@dir(%%CLAMAVUSER%%,%%CLAMAVGROUP%%,0755) %%LOGDIR%%
+@dir(%%CLAMAVUSER%%,%%CLAMAVGROUP%%,0755) %%RUNDIR%%
diff --git a/security/clamav/Makefile b/security/clamav/Makefile
index 6e0336b57503..ad1beb45d440 100644
--- a/security/clamav/Makefile
+++ b/security/clamav/Makefile
@@ -42,6 +42,8 @@ CFLAGS_i386=	-march=i486
 # force to use -lthr until it's not fixed.
 LDFLAGS+=	-lthr
 
+CONFLICTS_INSTALL=	clamav-[0-9]*
+
 SUB_FILES=	pkg-deinstall
 SUB_LIST+=	CHMOD=${CHMOD} \
 		CHOWN=${CHOWN} \