[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b

Tomasz Kojm tkojm at clamav.net
Sun Apr 4 01:05:11 UTC 2010


The following commit has been merged in the debian/unstable branch:
commit adc16eb592de4f3d31366e2b42418424fbc5b9e4
Author: Tomasz Kojm <tkojm at clamav.net>
Date:   Mon Sep 21 22:06:49 2009 +0200

    clamd: add support for DazukoFS (bb#1691)
    Patch from John Ogness <dazukocode*ogness.net>

diff --git a/ChangeLog b/ChangeLog
index 9b4a534..4f7e489 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Sep 21 22:05:38 CEST 2009 (tk)
+----------------------------------
+ * clamd: add support for DazukoFS (bb#1691)
+	  Patch from John Ogness <dazukocode*ogness.net>
+
 Fri Sep 18 20:02:06 CEST 2009 (tk)
 ----------------------------------
  * libclamav/matcher-bm.c: use mpool in BM's offset mode
diff --git a/clamd/Makefile.am b/clamd/Makefile.am
index 573ff64..d66b1b9 100644
--- a/clamd/Makefile.am
+++ b/clamd/Makefile.am
@@ -48,12 +48,16 @@ clamd_SOURCES = \
     others.h \
     clamuko.c \
     clamuko.h \
+    clamukofs.c \
+    clamukofs.h \
     dazukoio_compat12.c \
     dazukoio_compat12.h \
     dazukoio.c \
     dazukoio.h \
     dazuko_xp.h \
     dazukoio_xp.h \
+    dazukofs.c \
+    dazukofs.h \
     shared.h
 
 endif
diff --git a/clamd/Makefile.in b/clamd/Makefile.in
index a0a04a6..d636d37 100644
--- a/clamd/Makefile.in
+++ b/clamd/Makefile.in
@@ -82,9 +82,9 @@ am__clamd_SOURCES_DIST = $(top_srcdir)/shared/output.c \
 	$(top_srcdir)/shared/network.h clamd.c tcpserver.c tcpserver.h \
 	localserver.c localserver.h session.c session.h thrmgr.c \
 	thrmgr.h server-th.c server.h scanner.c scanner.h others.c \
-	others.h clamuko.c clamuko.h dazukoio_compat12.c \
-	dazukoio_compat12.h dazukoio.c dazukoio.h dazuko_xp.h \
-	dazukoio_xp.h shared.h
+	others.h clamuko.c clamuko.h clamukofs.c clamukofs.h \
+	dazukoio_compat12.c dazukoio_compat12.h dazukoio.c dazukoio.h \
+	dazuko_xp.h dazukoio_xp.h dazukofs.c dazukofs.h shared.h
 @BUILD_CLAMD_TRUE at am_clamd_OBJECTS = output.$(OBJEXT) \
 @BUILD_CLAMD_TRUE@	optparser.$(OBJEXT) getopt.$(OBJEXT) \
 @BUILD_CLAMD_TRUE@	misc.$(OBJEXT) network.$(OBJEXT) \
@@ -93,7 +93,9 @@ am__clamd_SOURCES_DIST = $(top_srcdir)/shared/output.c \
 @BUILD_CLAMD_TRUE@	thrmgr.$(OBJEXT) server-th.$(OBJEXT) \
 @BUILD_CLAMD_TRUE@	scanner.$(OBJEXT) others.$(OBJEXT) \
 @BUILD_CLAMD_TRUE@	clamuko.$(OBJEXT) \
+ at BUILD_CLAMD_TRUE@	clamukofs.$(OBJEXT) \
 @BUILD_CLAMD_TRUE@	dazukoio_compat12.$(OBJEXT) \
+ at BUILD_CLAMD_TRUE@	dazukofs.$(OBJEXT) \
 @BUILD_CLAMD_TRUE@	dazukoio.$(OBJEXT)
 clamd_OBJECTS = $(am_clamd_OBJECTS)
 clamd_LDADD = $(LDADD)
@@ -316,12 +318,16 @@ top_srcdir = @top_srcdir@
 @BUILD_CLAMD_TRUE@    others.h \
 @BUILD_CLAMD_TRUE@    clamuko.c \
 @BUILD_CLAMD_TRUE@    clamuko.h \
+ at BUILD_CLAMD_TRUE@    clamukofs.c \
+ at BUILD_CLAMD_TRUE@    clamukofs.h \
 @BUILD_CLAMD_TRUE@    dazukoio_compat12.c \
 @BUILD_CLAMD_TRUE@    dazukoio_compat12.h \
 @BUILD_CLAMD_TRUE@    dazukoio.c \
 @BUILD_CLAMD_TRUE@    dazukoio.h \
 @BUILD_CLAMD_TRUE@    dazuko_xp.h \
 @BUILD_CLAMD_TRUE@    dazukoio_xp.h \
+ at BUILD_CLAMD_TRUE@    dazukofs.c \
+ at BUILD_CLAMD_TRUE@    dazukofs.h \
 @BUILD_CLAMD_TRUE@    shared.h
 
 AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/shared -I$(top_srcdir)/libclamav
@@ -435,8 +441,10 @@ distclean-compile:
 
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/clamd.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/clamuko.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/clamukofs.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dazukoio.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dazukoio_compat12.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dazukofs.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/getopt.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/localserver.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/misc.Po at am__quote@
diff --git a/clamd/clamuko.c b/clamd/clamuko.c
index 48c4563..f414133 100644
--- a/clamd/clamuko.c
+++ b/clamd/clamuko.c
@@ -39,6 +39,7 @@
 #include "server.h"
 #include "others.h"
 #include "dazukoio.h"
+#include "clamukofs.h"
 #include "clamuko.h"
 
 struct dazuko_access *acc;
@@ -62,7 +63,7 @@ static void clamuko_exit(int sig)
     pthread_exit(NULL);
 }
 
-void *clamukoth(void *arg)
+static void *clamukolegacyth(void *arg)
 {
 	struct thrarg *tharg = (struct thrarg *) arg;
 	sigset_t sigset;
@@ -200,4 +201,15 @@ void *clamukoth(void *arg)
     return NULL;
 }
 
+void *clamukoth(void *arg)
+{
+	struct stat s;
+
+    /* we use DazukoFS if /dev/dazukofs.ctrl exists and it is a
+     * character device, otherwise we use Dazuko */
+    if(stat("/dev/dazukofs.ctrl", &s) != 0) return clamukolegacyth(arg);
+    if(!S_ISCHR(s.st_mode)) return clamukolegacyth(arg);
+    return clamukofsth(arg);
+}
+
 #endif
diff --git a/clamd/clamukofs.c b/clamd/clamukofs.c
new file mode 100644
index 0000000..0cdd451
--- /dev/null
+++ b/clamd/clamukofs.c
@@ -0,0 +1,249 @@
+/*
+ *  Copyright (C) 2007-2009 Sourcefire, Inc.
+ *    Author: Tomasz Kojm
+ *    Author: John Ogness <dazukocode at ogness.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ *  MA 02110-1301, USA.
+ */
+
+#if HAVE_CONFIG_H
+#include "clamav-config.h"
+#endif
+
+#ifdef CLAMUKO
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <signal.h>
+#include <pthread.h>
+
+#include "libclamav/clamav.h"
+
+#include "shared/optparser.h"
+#include "shared/output.h"
+
+#include "server.h"
+#include "others.h"
+#include "dazukofs.h"
+#include "clamuko.h"
+
+static pthread_mutex_t running_mutex = PTHREAD_MUTEX_INITIALIZER;
+static dazukofs_handle_t shutdown_hndl;
+static pthread_cond_t shutdown_cond;
+
+static void clamuko_exit(int sig)
+{
+    pthread_cond_signal(&shutdown_cond);
+}
+
+static int setup_shutdown_handle(const char *groupname)
+{
+    /* is another server thread is already running? */
+    if(shutdown_hndl) return -1;
+
+    if(pthread_cond_init(&shutdown_cond, NULL)) return -1;
+
+    /* handle used for shutdown by signal */
+    shutdown_hndl = dazukofs_open(groupname, DAZUKOFS_TRACK_GROUP);
+    if(!shutdown_hndl) {
+	logg("!Clamuko: Can't register with DazukoFS\n");
+	return -1;
+    }
+    return 0;
+}
+
+static void shutdown_clamuko(void)
+{
+	dazukofs_handle_t hndl = shutdown_hndl;
+
+    /* Set shutdown_hndl before closing because the close will
+     * immediately cause the scan threads to be interrupted.
+     * But they will only abort if shutdown_hndl is NULL. */
+    shutdown_hndl = NULL;
+
+    if(hndl) dazukofs_close(hndl, DAZUKOFS_REMOVE_GROUP);
+}
+
+static void *clamuko_scanth(void *arg)
+{
+	struct thrarg *tharg = (struct thrarg *) arg;
+	sigset_t sigset;
+	short int scan;
+	unsigned int sizelimit = 0;
+	struct stat sb;
+	dazukofs_handle_t scan_hndl;
+	struct dazukofs_access acc;
+	const char *groupname = "ClamAV";
+	int skip_scan = 0;
+	const char *virname;
+	char filename[4096];
+
+    /* ignore all signals */
+    sigfillset(&sigset);
+    /* The behavior of a process is undefined after it ignores a
+     * SIGFPE, SIGILL, SIGSEGV, or SIGBUS signal */
+    sigdelset(&sigset, SIGFPE);
+    sigdelset(&sigset, SIGILL);
+    sigdelset(&sigset, SIGSEGV);
+#ifdef SIGBUS
+    sigdelset(&sigset, SIGBUS);
+#endif
+    pthread_sigmask(SIG_SETMASK, &sigset, NULL);
+
+    /* register */
+    scan_hndl = dazukofs_open(groupname, DAZUKOFS_TRACK_GROUP);
+    if(!scan_hndl) {
+	logg("!Clamuko: Can't register with DazukoFS\n");
+	return NULL;
+    } else {
+	logg("Clamuko: Correctly registered with DazukoFS.\n");
+    }
+
+    /* access mask (not used by DazukoFS) */
+    if(optget(tharg->opts, "ClamukoScanOnOpen")->enabled)
+	logg("!Clamuko: ClamukoScanOnOpen ignored when using DazukoFS.\n");
+    if(optget(tharg->opts, "ClamukoScanOnClose")->enabled)
+	logg("!Clamuko: ClamukoScanOnClose ignored when using DazukoFS.\n");
+    if(optget(tharg->opts, "ClamukoScanOnExec")->enabled)
+	logg("!Clamuko: ClamukoScanOnExec ignored when using DazukoFS.\n");
+    if(optget(tharg->opts, "ClamukoIncludePath")->enabled)
+	logg("!Clamuko: ClamukoIncludePath ignored when using DazukoFS.\n");
+    if(optget(tharg->opts, "ClamukoExcludePath")->enabled)
+	logg("!Clamuko: ClamukoExcludePath ignored when using DazukoFS.\n");
+
+    sizelimit = optget(tharg->opts, "ClamukoMaxFileSize")->numarg;
+    if(sizelimit)
+	logg("Clamuko: Max file size limited to %u bytes.\n", sizelimit);
+    else
+	logg("Clamuko: File size limit disabled.\n");
+
+    while(1) {
+	if(dazukofs_get_access(scan_hndl, &acc)) {
+	    if(!shutdown_hndl)
+		break;
+	    continue;
+	}
+
+	if(!fstat(acc.fd, &sb)) {
+	    if(S_ISDIR(sb.st_mode)) {
+		/* don't try to scan directories */
+		skip_scan = 1;
+	    } else if(sb.st_size > sizelimit) {
+		dazukofs_get_filename(&acc, filename, sizeof(filename));
+		logg("*Clamuko: %s skipped (too big)\n", filename);
+		skip_scan = 1;
+	    }
+	}
+
+	if(skip_scan) {
+	    acc.deny = 0;
+	    /* reset skip flag */
+	    skip_scan = 0;
+	} else if(cl_scandesc(acc.fd, &virname, NULL, tharg->engine,
+			      tharg->options) == CL_VIRUS) {
+	    dazukofs_get_filename(&acc, filename, sizeof(filename));
+	    logg("Clamuko: %s: %s FOUND\n", filename, virname);
+	    /* we can not perform any special action because it will
+	     * trigger DazukoFS recursively */
+	    acc.deny = 1;
+	} else {
+	    acc.deny = 0;
+	}
+
+	if(dazukofs_return_access(scan_hndl, &acc)) {
+	    if(shutdown_hndl)
+	        logg("!Clamuko: Can't return access to DazukoFS.\n");
+	    break;
+	}
+    }
+
+    dazukofs_close(scan_hndl, 0);
+
+    if(shutdown_hndl)
+        logg("!Clamuko: A scanner thread has unexpectedly shutdown.\n");
+
+    return NULL;
+}
+
+void *clamukofsth(void *arg)
+{
+	struct thrarg *tharg = (struct thrarg *) arg;
+	sigset_t sigset;
+        struct sigaction act;
+	pthread_t *clamuko_pids = NULL;
+	const char *groupname = "ClamAV";
+	int count;
+	int started;
+
+    /* is another server thread already working? */
+    if(pthread_mutex_trylock(&running_mutex))
+	return NULL;
+
+    /* ignore all signals except SIGUSR1 */
+    sigfillset(&sigset);
+    sigdelset(&sigset, SIGUSR1);
+    /* The behavior of a process is undefined after it ignores a
+     * SIGFPE, SIGILL, SIGSEGV, or SIGBUS signal */
+    sigdelset(&sigset, SIGFPE);
+    sigdelset(&sigset, SIGILL);
+    sigdelset(&sigset, SIGSEGV);
+#ifdef SIGBUS
+    sigdelset(&sigset, SIGBUS);
+#endif
+    pthread_sigmask(SIG_SETMASK, &sigset, NULL);
+
+    count = optget(tharg->opts, "ClamukoScannerCount")->numarg;
+    if(count < 1) goto out;
+
+    clamuko_pids = calloc(count, sizeof(pthread_t));
+    if(!clamuko_pids) goto out;
+
+    if(setup_shutdown_handle(groupname)) goto out;
+
+    act.sa_handler = clamuko_exit;
+    sigfillset(&(act.sa_mask));
+    sigaction(SIGUSR1, &act, NULL);
+    sigaction(SIGSEGV, &act, NULL);
+
+    for(started = 0; started < count; started++) {
+	pthread_attr_t clamuko_attr;
+
+	if(pthread_attr_init(&clamuko_attr)) break;
+	pthread_attr_setdetachstate(&clamuko_attr, PTHREAD_CREATE_JOINABLE);
+	if(pthread_create(&clamuko_pids[started], &clamuko_attr,
+			  clamuko_scanth, tharg)) break;
+	logg("Clamuko: Started scanner thread %d.\n", started);
+    }
+
+    pthread_cond_wait(&shutdown_cond, &running_mutex);
+    logg("Clamuko: Stop signal received.\n");
+
+    shutdown_clamuko();
+
+    for(started-- ; started >= 0; started--) {
+	logg("Clamuko: Waiting for scanner thread %d to finish.\n", started);
+	pthread_join(clamuko_pids[started], NULL);
+    }
+
+    logg("Clamuko: Stopped.\n");
+out:
+    if(clamuko_pids) free(clamuko_pids);
+    pthread_mutex_unlock(&running_mutex);
+    return NULL;
+}
+
+#endif
diff --git a/clamd/clamuko.h b/clamd/clamukofs.h
similarity index 84%
copy from clamd/clamuko.h
copy to clamd/clamukofs.h
index e70e4b4..6353983 100644
--- a/clamd/clamuko.h
+++ b/clamd/clamukofs.h
@@ -1,7 +1,6 @@
 /*
- *  Copyright (C) 2007-2009 Sourcefire, Inc.
- *
- *  Authors: Tomasz Kojm
+ *  Copyright (C) 2009 Sourcefire, Inc.
+ *    Author: John Ogness <dazukocode at ogness.net>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -23,8 +22,7 @@
 #ifndef __CLAMUKO_H
 #define __CLAMUKO_H
 
-extern short int clamuko_scanning;
-void *clamukoth(void *arg);
+extern void *clamukofsth(void *arg);
 
 #endif
 #endif
diff --git a/clamd/dazukofs.c b/clamd/dazukofs.c
new file mode 100644
index 0000000..671fde6
--- /dev/null
+++ b/clamd/dazukofs.c
@@ -0,0 +1,238 @@
+/* userspace library to interface with dazukofs
+
+   Copyright (C) 2008-2009 John Ogness
+     Author: John Ogness <dazukocode at ogness.net>
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "dazukofs.h"
+
+struct dazukofs_handle
+{
+	int dev_fd;
+	unsigned long event_id;
+	char *group_name;
+};
+
+#define DAZUKOFS_ALLOWED_GROUPCHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-"
+static int check_group_name(const char *gname)
+{
+	size_t len = strlen(gname);
+	const char *p;
+
+	if (len > 20)
+		return -1;
+
+	for (p = gname; *p; p++) {
+		if (strchr(DAZUKOFS_ALLOWED_GROUPCHARS, *p) == NULL)
+			return -1;
+	}
+
+	return 0;
+}
+
+dazukofs_handle_t dazukofs_open(const char *gname, int flags)
+{
+	struct dazukofs_handle *hndl = NULL;
+	char key[25];
+	char buf[256];
+	char *p;
+	int gid;
+	int fd;
+
+	if (check_group_name(gname) != 0)
+		goto error_out;
+
+	fd = open("/dev/dazukofs.ctrl", O_RDWR);
+	if (fd == -1) {
+		/* try to read at least
+		 * (maybe the group already exists) */
+		fd = open("/dev/dazukofs.ctrl", O_RDONLY);
+		if (fd == -1)
+			goto error_out;
+	} else {
+		memset(buf, 0, sizeof(buf));
+
+		if (flags & DAZUKOFS_TRACK_GROUP)
+			snprintf(buf, sizeof(buf) - 1, "addtrack=%s", gname);
+		else
+			snprintf(buf, sizeof(buf) - 1, "add=%s", gname);
+
+		if (write(fd, buf, strlen(buf)) == -1)
+			goto error_out_close;
+
+		lseek(fd, 0, SEEK_SET);
+	}
+
+	memset(buf, 0, sizeof(buf));
+	if (read(fd, buf, sizeof(buf)-1) == -1)
+		goto error_out_close;
+
+	memset(key, 0, sizeof(key));
+	snprintf(key, sizeof(key) - 1, ":%s\n", gname);
+
+	p = strstr(buf, key);
+	if (!p || p == buf)
+		goto error_out_close;
+
+	p--;
+	gid = *p - '0';
+	if (gid < 0 || gid > 9)
+		goto error_out_close;
+
+	hndl = malloc(sizeof(struct dazukofs_handle));
+	if (!hndl)
+		goto error_out_close;
+	memset(hndl, 0, sizeof(struct dazukofs_handle));
+
+	hndl->group_name = strdup(gname);
+	if (!hndl->group_name)
+		goto error_out_free;
+
+	memset(key, 0, sizeof(key));
+	snprintf(key, sizeof(key) - 1, "/dev/dazukofs.%d", gid);
+
+	hndl->dev_fd = open(key, O_RDWR);
+	if (hndl->dev_fd == -1)
+		goto error_out_free;
+
+	close(fd);
+
+	return hndl;
+
+error_out_free:
+	if (hndl->group_name)
+		free(hndl->group_name);
+	free(hndl);
+	hndl = NULL;
+error_out_close:
+	close(fd);
+error_out:
+	return hndl;
+}
+
+int dazukofs_close(dazukofs_handle_t hndl, int flags)
+{
+	char buf[48];
+	int fd;
+	int ret = -1;
+
+	if (flags & DAZUKOFS_REMOVE_GROUP) {
+		fd = open("/dev/dazukofs.ctrl", O_WRONLY);
+		if (fd == -1)
+			goto error_out;
+
+		memset(buf, 0, sizeof(buf));
+		snprintf(buf, sizeof(buf) - 1, "del=%s", hndl->group_name);
+
+		if (write(fd, buf, strlen(buf)) == -1) {
+			close(fd);
+			goto error_out;
+		}
+
+		close(fd);
+	}
+
+	ret = close(hndl->dev_fd);
+	if (ret != 0)
+		goto error_out;
+
+	free(hndl->group_name);
+	free(hndl);
+
+	return 0;
+
+error_out:
+	return ret;
+}
+
+int dazukofs_get_access(dazukofs_handle_t hndl, struct dazukofs_access *acc)
+{
+	char buf[48];
+	char *p;
+	int err = -1;
+
+	memset(buf, 0, sizeof(buf));
+	if (read(hndl->dev_fd, buf, sizeof(buf)-1) == -1)
+		goto out;
+
+	p = strstr(buf, "id=");
+	if (!p)
+		goto out;
+	p += 3;
+	hndl->event_id = strtoul(p, &p, 10);
+
+	p = strstr(p, "fd=");
+	if (!p)
+		goto out;
+	p += 3;
+	acc->fd = (int)strtol(p, &p, 10);
+
+	p = strstr(p, "pid=");
+	if (!p)
+		goto out;
+	p += 4;
+	acc->pid = strtoul(p, NULL, 10);
+
+	acc->deny = 0;
+
+	err = 0;
+out:
+	return err;
+}
+
+int dazukofs_return_access(dazukofs_handle_t hndl, struct dazukofs_access *acc)
+{
+	char buf[48];
+	int err = -1;
+
+	if (close(acc->fd) != 0)
+		goto out;
+	snprintf(buf, sizeof(buf)-1, "id=%lu r=%d", hndl->event_id,
+		 acc->deny ? 1 : 0);
+	buf[sizeof(buf)-1] = 0;
+
+	if (write(hndl->dev_fd, buf, strlen(buf)) == -1)
+		goto out;
+	lseek(hndl->dev_fd, 0, SEEK_SET);
+	err = 0;
+out:
+	return err;
+}
+
+int dazukofs_get_filename(struct dazukofs_access *acc, char *buf, size_t bufsiz)
+{
+	char proc[48];
+	int ret;
+
+	memset(proc, 0, sizeof(proc));
+	snprintf(proc, sizeof(proc) - 1, "/proc/self/fd/%d", acc->fd);
+	ret = readlink(proc, buf, bufsiz - 1);
+	buf[bufsiz - 1] = 0;
+	if (ret > 0)
+		buf[ret] = 0;
+
+	return ret;
+}
diff --git a/clamd/dazukofs.h b/clamd/dazukofs.h
new file mode 100644
index 0000000..e493000
--- /dev/null
+++ b/clamd/dazukofs.h
@@ -0,0 +1,48 @@
+/* userspace library to interface with dazukofs
+
+   Copyright (C) 2008 John Ogness
+     Author: John Ogness <dazukocode at ogness.net>
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+*/
+
+#ifndef __DAZUKOFS_H
+#define __DAZUKOFS_H
+
+#include <stdio.h>
+
+/* dazukofs_open() flags */
+#define DAZUKOFS_TRACK_GROUP 1
+
+/* dazukofs_close() flags */
+#define DAZUKOFS_REMOVE_GROUP 1
+
+struct dazukofs_handle;
+typedef struct dazukofs_handle * dazukofs_handle_t;
+
+struct dazukofs_access
+{
+	int fd;
+	int deny;
+	unsigned long pid;
+};
+
+dazukofs_handle_t dazukofs_open(const char *gname, int flags);
+int dazukofs_get_access(dazukofs_handle_t hndl, struct dazukofs_access *acc);
+int dazukofs_return_access(dazukofs_handle_t hndl, struct dazukofs_access *acc);
+int dazukofs_close(dazukofs_handle_t hndl, int flags);
+int dazukofs_get_filename(struct dazukofs_access *acc, char *buf, size_t bufsiz);
+
+#endif /* __DAZUKOFS_H */
diff --git a/etc/clamd.conf b/etc/clamd.conf
index ba45de7..79666db 100644
--- a/etc/clamd.conf
+++ b/etc/clamd.conf
@@ -403,15 +403,26 @@ LocalSocket /tmp/clamd.socket
 
 ##
 ## Clamuko settings
-## WARNING: This is experimental software. It is very likely it will hang
-##	    up your system!!!
 ##
 
-# Enable Clamuko. Dazuko (/dev/dazuko) must be configured and running.
+# Enable Clamuko. Dazuko must be configured and running. Clamuko supports
+# both Dazuko (/dev/dazuko) and DazukoFS (/dev/dazukofs.ctrl). DazukoFS
+# is the preferred option. For more information please visit www.dazuko.org
 # Default: no
 #ClamukoScanOnAccess yes
 
-# Set access mask for Clamuko.
+# The number of scanner threads that will be started (DazukoFS only).
+# Having multiple scanner threads allows Clamuko to serve multiple
+# processes simultaneously. This is particularly beneficial on SMP machines.
+# Default: 3
+#ClamukoScannerCount 3
+
+# Don't scan files larger than ClamukoMaxFileSize
+# Value of 0 disables the limit.
+# Default: 5M
+#ClamukoMaxFileSize 10M
+
+# Set access mask for Clamuko (Dazuko only).
 # Default: no
 #ClamukoScanOnOpen yes
 #ClamukoScanOnClose yes
@@ -419,16 +430,11 @@ LocalSocket /tmp/clamd.socket
 
 # Set the include paths (all files inside them will be scanned). You can have
 # multiple ClamukoIncludePath directives but each directory must be added
-# in a seperate line.
+# in a seperate line. (Dazuko only)
 # Default: disabled
 #ClamukoIncludePath /home
 #ClamukoIncludePath /students
 
-# Set the exclude paths. All subdirectories are also excluded.
+# Set the exclude paths. All subdirectories are also excluded. (Dazuko only)
 # Default: disabled
 #ClamukoExcludePath /home/bofh
-
-# Don't scan files larger than ClamukoMaxFileSize
-# Value of 0 disables the limit.
-# Default: 5M
-#ClamukoMaxFileSize 10M
diff --git a/shared/optparser.c b/shared/optparser.c
index 893aeb1..c9ac8bc 100644
--- a/shared/optparser.c
+++ b/shared/optparser.c
@@ -289,6 +289,8 @@ const struct clam_option clam_options[] = {
 
     { "ClamukoScanOnAccess", NULL, 0, TYPE_BOOL, MATCH_BOOL, -1, NULL, 0, OPT_CLAMD, "This option enables Clamuko. Dazuko needs to be already configured and\nrunning.", "no" },
 
+    { "ClamukoScannerCount", NULL, 0, TYPE_NUMBER, MATCH_NUMBER, 3, NULL, 0, OPT_CLAMD, "The number of scanner threads that will be started (DazukoFS only).\nHaving multiple scanner threads allows Clamuko to serve multiple\nprocesses simultaneously. This is particularly beneficial on SMP machines.", "3" },
+
     { "ClamukoScanOnOpen", NULL, 0, TYPE_BOOL, MATCH_BOOL, -1, NULL, 0, OPT_CLAMD, "Scan files when they get opened by the system.", "yes" },
 
     { "ClamukoScanOnClose", NULL, 0, TYPE_BOOL, MATCH_BOOL, -1, NULL, 0, OPT_CLAMD, "Scan files when they get closed by the system.", "yes" },

-- 
Debian repository for ClamAV



More information about the Pkg-clamav-commits mailing list