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; }
/** * 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; }