Esempio n. 1
0
static int ext2_readlink(struct inode *inode, char *buf)
{
    struct fs_info *fs = inode->fs;
    int sec_per_block = 1 << (fs->block_shift - fs->sector_shift);
    bool fast_symlink;

    if (inode->size > BLOCK_SIZE(fs))
	return -1;		/* Error! */

    fast_symlink = (inode->file_acl ? sec_per_block : 0) == inode->blocks;
    if (fast_symlink)
	memcpy(buf, PVT(inode)->i_block, inode->size);
    else
	cache_get_file(inode, buf, inode->size);

    return inode->size;
}
Esempio n. 2
0
/**
 * Generates a checksum file for a given index and stores it in a file_t
 *  - file: Where to store the checksum file
 */
void cache_gen_crc(cache_t* cache, int index, file_t* file)
{
	int num_files = cache->num_files[index];
	size_t num_crcs = (num_files+1);
	size_t buf_len = num_crcs*4;
	uint32_t crc_buf[num_crcs];
	/* calculate the crc table */
	crc_buf[num_files] = 1234;
	for (int i = 0; i < num_files; i++) {
		file_t* file = cache_get_file(cache, index, i);
		crc_buf[i] = crc32(0L, Z_NULL, 0);
		crc_buf[i] = crc32(crc_buf[i], (const unsigned char*)file->data, file->length);
		crc_buf[num_files] = (crc_buf[num_files] << 1) + crc_buf[i];
		crc_buf[i] = htonl(crc_buf[i]);
	}
	crc_buf[num_files] = htonl(crc_buf[num_files]);
	file->data = (unsigned char*)malloc(buf_len);
	memcpy(file->data, (char*)&crc_buf, buf_len);
	file->length = buf_len;
}