implement fmap Win32 API in terms of cl_fmap_open_memory

remotes/push_mirror/fmapify
Török Edvin 14 years ago
parent 6372c0dc16
commit 89c638eb44
  1. 63
      libclamav/fmap.c

@ -131,8 +131,8 @@ fmap_t *fmap_check_empty(int fd, off_t offset, size_t len, int *empty) {
return m;
}
cl_fmap_t *cl_fmap_open_handle(void *handle, size_t offset, size_t len,
clcb_pread pread_cb, int use_aging)
extern cl_fmap_t *cl_fmap_open_handle(void *handle, size_t offset, size_t len,
clcb_pread pread_cb, int use_aging)
{
unsigned int pages, mapsz, hdrsz;
cl_fmap_t *m;
@ -571,11 +571,32 @@ static void mem_unneed_off(fmap_t *m, size_t at, size_t len);
static const void *mem_need_offstr(fmap_t *m, size_t at, size_t len_hint);
static const void *mem_gets(fmap_t *m, char *dst, size_t *at, size_t max_len);
static void unmap_none(fmap_t *m) {}
extern cl_fmap_t *cl_fmap_open_memory(const void *start, size_t len)
{
cl_fmap_t *m = cli_calloc(1, sizeof(*m));
if (!m) {
cli_warnmsg("fmap: map allocation failed\n");
return NULL;
}
m->data = start;
m->len = len;
m->unmap = unmap_none;
m->need = mem_need;
m->need_offstr = mem_need_offstr;
m->gets = mem_gets;
m->unneed_off = mem_unneed_off;
}
fmap_t *fmap_check_empty(int fd, off_t offset, size_t len, int *empty) { /* WIN32 */
unsigned int pages, mapsz, hdrsz;
int pgsz = cli_getpagesize();
struct stat st;
fmap_t *m;
const void *data;
HANDLE fh;
HANDLE mh;
*empty = 0;
if(fstat(fd, &st)) {
@ -600,40 +621,30 @@ fmap_t *fmap_check_empty(int fd, off_t offset, size_t len, int *empty) { /* WIN3
pages = fmap_align_items(len, pgsz);
hdrsz = fmap_align_to(sizeof(fmap_t), pgsz);
if(!(m = (fmap_t *)cli_calloc(1, sizeof(fmap_t)))) {
cli_errmsg("fmap: canot allocate fmap_t\n", fd);
return NULL;
}
if((m->fh = (HANDLE)_get_osfhandle(fd)) == INVALID_HANDLE_VALUE) {
if((fh = (HANDLE)_get_osfhandle(fd)) == INVALID_HANDLE_VALUE) {
cli_errmsg("fmap: cannot get a valid handle for descriptor %d\n", fd);
free(m);
return NULL;
}
if(!(m->mh = CreateFileMapping(m->fh, NULL, PAGE_READONLY, (DWORD)((len>>31)>>1), (DWORD)len, NULL))) {
if(!(mh = CreateFileMapping(m->fh, NULL, PAGE_READONLY, (DWORD)((len>>31)>>1), (DWORD)len, NULL))) {
cli_errmsg("fmap: cannot create a map of descriptor %d\n", fd);
free(m);
CloseHandle(fh);
return NULL;
}
if(!(m->data = MapViewOfFile(m->mh, FILE_MAP_READ, (DWORD)((offset>>31)>>1), (DWORD)(offset), len))) {
if(!(data = MapViewOfFile(m->mh, FILE_MAP_READ, (DWORD)((offset>>31)>>1), (DWORD)(offset), len))) {
cli_errmsg("fmap: cannot map file descriptor %d\n", fd);
CloseHandle(m->mh);
free(m);
CloseHandle(mh);
CloseHandle(fh);
return NULL;
}
m->dumb = dumb;
m->mtime = st.st_mtime;
m->offset = offset;
m->len = len;
m->pages = pages;
m->hdrsz = hdrsz;
m->pgsz = pgsz;
m->paged = 0;
m->dont_cache_flag = 0;
if(!(m = cl_fmap_open_memory(data, len))) {
cli_errmsg("fmap: canot allocate fmap_t\n", fd);
CloseHandle(mh);
CloseHandle(fh);
return NULL;
}
m->fh = fh;
m->mh = mh;
m->unmap = unmap_win32;
m->need = mem_need;
m->need_offstr = mem_need_offstr;
m->gets = mem_gets;
m->unneed_off = mem_unneed_off;
return m;
}

Loading…
Cancel
Save