int open_map(int fd, struct stat *sb, const char * const name)
{
// !!! Map process into memory
new_files[num_new_files].start = mmap(NULL, sb->st_size, PROT_READ, MAP_SHARED, fd, 0);
if(new_files[num_new_files].start == MAP_FAILED)
{
log(LOG_ERR, "Error mmaping %s: %s", name, strerror(errno));
close(fd);
return 0;
}
// !!! Lock in-memory process down
if(mlock(new_files[num_new_files].start, sb->st_size) == -1)
{
log(LOG_ERR, "Can't lock memory for %s, error %s", name, strerror(errno));
munmap(new_files[num_new_files].start, sb->st_size);
close(fd);
return 0;
}
if(sb->st_size % page_size)
new_files[num_new_files].map_size = sb->st_size - (sb->st_size % page_size)
+ page_size;
else
new_files[num_new_files].map_size = sb->st_size;
new_files[num_new_files].fd = fd;
memcpy(&new_files[num_new_files].sb, sb, sizeof(struct stat));
new_files[num_new_files].name = strdup(name);
num_new_files++;
log(LOG_INFO, "Mapped file %s", name);
return 1;
}