[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b
aCaB
acab at clamav.net
Sun Apr 4 00:59:57 UTC 2010
The following commit has been merged in the debian/unstable branch:
commit db84a7e286971d48b91f98f2f7790c3ab7b7474e
Author: aCaB <acab at clamav.net>
Date: Thu Aug 20 01:07:33 2009 +0200
fmap_need, paged read
diff --git a/libclamav/fmap.c b/libclamav/fmap.c
index 249dcb4..d29e815 100644
--- a/libclamav/fmap.c
+++ b/libclamav/fmap.c
@@ -29,15 +29,22 @@
#include <unistd.h>
#include "others.h"
+#include "cltypes.h"
+
+#define FM_MASK_SCORE 0x0x3FFF
+#define FM_MASK_PAGED 0x4000
+#define FM_MASK_SEEN 0x8000
+#define FM_SCORE 8
struct F_MAP {
int fd;
time_t mtime;
- off_t offset;
+ size_t offset;
size_t len;
unsigned int pages;
unsigned int hdrsz;
- unsigned char bitmap[];
+ unsigned int pgsz;
+ uint16_t bitmap[];
};
@@ -49,6 +56,33 @@ static unsigned int fmap_align_to(unsigned int sz, unsiggned int al) {
return al * fmap_align_items(sz, al);
}
+static unsigned int fmap_which_page(struct F_MAP *m, size_t at) {
+ return at / m->pgsz;
+}
+
+static unsigned int fmap_is_paged(struct F_MAP *m, unsigned int page) {
+ uint16_t s = m->bitmap[page];
+ return ((s & FM_MASK_PAGED) != 0);
+}
+
+static unsigned int fmap_is_seen(struct F_MAP *m, unsigned int page) {
+ uint16_t s = m->bitmap[page];
+ return ((s & FM_MASK_SEEN) != 0);
+}
+
+static unsigned int fmap_inc_paged(struct F_MAP *m, unsigned int page) {
+ uint16_t s = m->bitmap[page] & FM_MASK_SCORE;
+ if(s < FM_MASK_SCORE - FM_SCORE)
+ m->bitmap[page] += FM_SCORE;
+ else
+ m->bitmap[page] |= FM_MASK_SCORE;
+}
+
+static unsigned int fmap_dec_paged(struct F_MAP *m, unsigned int page) {
+ uint16_t s = m->bitmap[page] & FM_MASK_SCORE;
+ if(s) s->bitmap[page]--;
+}
+
struct F_MAP *fmap(int fd, off_t offset, size_t len) {
unsigned int pages, mapsz, hdrsz;
int pgsz = cli_getpagesize();
@@ -73,7 +107,7 @@ struct F_MAP *fmap(int fd, off_t offset, size_t len) {
return NULL;
}
pages = fmap_align_items(len, pgsz);
- hdrsz = fmap_align_to(sizeof(struct F_MAP) + fmap_align_items(2 * pages, 8), 16);
+ hdrsz = fmap_align_to(sizeof(struct F_MAP) + pages * sizeof(uint16_t), 16);
mapsz = pages * pgsz + hdrsz;
if ((m = (struct F_MAP *)mmap(NULL, mapsz, PROT_READ | PROT_WRITE, MAP_PRIVATE|ANONYMOUS_MAP, -1, 0)) == MAP_FAILED) {
cli_warnmsg("fmap: mmap() failed\n");
@@ -85,6 +119,52 @@ struct F_MAP *fmap(int fd, off_t offset, size_t len) {
m->len = len;
m->pages = pages;
m->hdrsz = hdrsz;
+ m->pgsz = pgsz;
memset(m->bitmap, 0, fmap_align_items(2 * pages, 8));
return m;
}
+
+static int fmap_readpage(struct F_MAP *m, unsigned int page) {
+ size_t readsz;
+ char *pptr;
+
+ fmap_inc_page(m, page);
+ if(fmap_is_paged(m, page))
+ return 0;
+ pptr = (char *)m;
+ pptr += page * m->pgsz + m->hdrsz;
+ if(page == m->pages - 1)
+ readsz = m->len % m->pgsz;
+ else
+ readsz = m->pgsz;
+ if(pread(m->fd, pptr, m->pgsz, m->offset + page * m->pgsz) != readsz)
+ return 1;
+ return 0;
+}
+
+void *fmap_need(struct F_MAP *m, size_t at, size_t len) {
+ unsigned int i, first_page, last_page;
+ char *ret;
+
+ if(!len) {
+ cli_warnmsg("fmap: attempted void need\n");
+ return NULL;
+ }
+
+ if(!CLI_ISCONTAINED(0, m->len, at, len)) {
+ cli_warnmsg("fmap: attempted oof need\n");
+ return NULL;
+ }
+
+ first_page = fmap_which_page(m, at);
+ last_page = fmap_which_page(m, at + len);
+
+ for(i=first_page; i<=last_page; i++) {
+ if(fmap_readpage(m, i))
+ return NULL;
+ }
+ ret = (char *)m;
+ ret += at + m->hdrsz;
+ return (void *)ret;
+}
+
--
Debian repository for ClamAV
More information about the Pkg-clamav-commits
mailing list