void read_fragment_table(squashfs_super_block *sBlk) { int i, indexes = SQUASHFS_FRAGMENT_INDEXES(sBlk->fragments); squashfs_fragment_index fragment_table_index[indexes]; TRACE("read_fragment_table: %d fragments, reading %d fragment indexes from 0x%llx\n", sBlk->fragments, indexes, sBlk->fragment_table_start); if(sBlk->fragments == 0) return; if((fragment_table = (squashfs_fragment_entry *) malloc(sBlk->fragments * sizeof(squashfs_fragment_entry))) == NULL) EXIT_UNSQUASH("read_fragment_table: failed to allocate fragment table\n"); if(swap) { squashfs_fragment_index sfragment_table_index[indexes]; read_bytes(sBlk->fragment_table_start, SQUASHFS_FRAGMENT_INDEX_BYTES(sBlk->fragments), (char *) sfragment_table_index); SQUASHFS_SWAP_FRAGMENT_INDEXES(fragment_table_index, sfragment_table_index, indexes); } else read_bytes(sBlk->fragment_table_start, SQUASHFS_FRAGMENT_INDEX_BYTES(sBlk->fragments), (char *) fragment_table_index); for(i = 0; i < indexes; i++) { int length = read_block(fragment_table_index[i], NULL, ((char *) fragment_table) + (i * SQUASHFS_METADATA_SIZE), sBlk); TRACE("Read fragment table block %d, from 0x%llx, length %d\n", i, fragment_table_index[i], length); } if(swap) { squashfs_fragment_entry sfragment; for(i = 0; i < sBlk->fragments; i++) { SQUASHFS_SWAP_FRAGMENT_ENTRY((&sfragment), (&fragment_table[i])); memcpy((char *) &fragment_table[i], (char *) &sfragment, sizeof(squashfs_fragment_entry)); } } }
int read_inode_lookup_table(int fd, squashfs_super_block *sBlk, squashfs_inode **inode_lookup_table) { int lookup_bytes = SQUASHFS_LOOKUP_BYTES(sBlk->inodes); int indexes = SQUASHFS_LOOKUP_BLOCKS(sBlk->inodes); long long index[indexes]; int i; if(sBlk->lookup_table_start == SQUASHFS_INVALID_BLK) return 1; if((*inode_lookup_table = malloc(lookup_bytes)) == NULL) { ERROR("Failed to allocate inode lookup table\n"); return 0; } if(swap) { long long sindex[indexes]; read_bytes(fd, sBlk->lookup_table_start, SQUASHFS_LOOKUP_BLOCK_BYTES(sBlk->inodes), (char *) sindex); SQUASHFS_SWAP_FRAGMENT_INDEXES(index, sindex, indexes); } else read_bytes(fd, sBlk->lookup_table_start, SQUASHFS_LOOKUP_BLOCK_BYTES(sBlk->inodes), (char *) index); for(i = 0; i < indexes; i++) { int length = read_block(fd, index[i], NULL, ((unsigned char *) *inode_lookup_table) + (i * SQUASHFS_METADATA_SIZE), sBlk); TRACE("Read inode lookup table block %d, from 0x%llx, length %d\n", i, index[i], length); } if(swap) { squashfs_inode_t sinode; for(i = 0; i < sBlk->inodes; i++) { SQUASHFS_SWAP_INODE_T((&sinode), (&(*inode_lookup_table)[i])); memcpy((char *) &(*inode_lookup_table)[i], (char *) &sinode, sizeof(squashfs_inode_t)); } } return 1; }