errcode_t ext2fs_read_ext_attr(ext2_filsys fs, blk_t block, void *buf) { errcode_t retval; retval = io_channel_read_blk(fs->io, block, 1, buf); if (retval) return retval; #ifdef EXT2FS_ENABLE_SWAPFS if ((fs->flags & (EXT2_FLAG_SWAP_BYTES| EXT2_FLAG_SWAP_BYTES_READ)) != 0) ext2fs_swap_ext_attr(fs, buf, buf); #endif return 0; }
errcode_t ext2fs_write_ext_attr(ext2_filsys fs, blk_t block, void *inbuf) { errcode_t retval; char *write_buf; char *buf = NULL; #ifdef EXT2FS_ENABLE_SWAPFS if ((fs->flags & EXT2_FLAG_SWAP_BYTES) || (fs->flags & EXT2_FLAG_SWAP_BYTES_WRITE)) { retval = ext2fs_get_mem(fs->blocksize, (void **) &buf); if (retval) return retval; write_buf = buf; ext2fs_swap_ext_attr(fs, buf, inbuf); } else #endif write_buf = (char *) inbuf; retval = io_channel_write_blk(fs->io, block, 1, write_buf); if (buf) ext2fs_free_mem((void **) &buf); if (!retval) ext2fs_mark_changed(fs); return retval; }
void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t, struct ext2_inode_large *f, int hostorder, int bufsize) { unsigned i, has_data_blocks, extra_isize, attr_magic; int has_extents = 0; int islnk = 0; __u32 *eaf, *eat; if (hostorder && LINUX_S_ISLNK(f->i_mode)) islnk = 1; t->i_mode = ext2fs_swab16(f->i_mode); if (!hostorder && LINUX_S_ISLNK(t->i_mode)) islnk = 1; t->i_uid = ext2fs_swab16(f->i_uid); t->i_size = ext2fs_swab32(f->i_size); t->i_atime = ext2fs_swab32(f->i_atime); t->i_ctime = ext2fs_swab32(f->i_ctime); t->i_mtime = ext2fs_swab32(f->i_mtime); t->i_dtime = ext2fs_swab32(f->i_dtime); t->i_gid = ext2fs_swab16(f->i_gid); t->i_links_count = ext2fs_swab16(f->i_links_count); t->i_file_acl = ext2fs_swab32(f->i_file_acl); if (hostorder) has_data_blocks = ext2fs_inode_data_blocks(fs, (struct ext2_inode *) f); t->i_blocks = ext2fs_swab32(f->i_blocks); if (!hostorder) has_data_blocks = ext2fs_inode_data_blocks(fs, (struct ext2_inode *) t); if (hostorder && (f->i_flags & EXT4_EXTENTS_FL)) has_extents = 1; t->i_flags = ext2fs_swab32(f->i_flags); if (!hostorder && (t->i_flags & EXT4_EXTENTS_FL)) has_extents = 1; t->i_dir_acl = ext2fs_swab32(f->i_dir_acl); if (!has_extents && (!islnk || has_data_blocks)) { for (i = 0; i < EXT2_N_BLOCKS; i++) t->i_block[i] = ext2fs_swab32(f->i_block[i]); } else if (t != f) { for (i = 0; i < EXT2_N_BLOCKS; i++) t->i_block[i] = f->i_block[i]; } t->i_generation = ext2fs_swab32(f->i_generation); t->i_faddr = ext2fs_swab32(f->i_faddr); switch (fs->super->s_creator_os) { case EXT2_OS_LINUX: t->osd1.linux1.l_i_version = ext2fs_swab32(f->osd1.linux1.l_i_version); t->osd2.linux2.l_i_blocks_hi = ext2fs_swab16(f->osd2.linux2.l_i_blocks_hi); t->osd2.linux2.l_i_file_acl_high = ext2fs_swab16(f->osd2.linux2.l_i_file_acl_high); t->osd2.linux2.l_i_uid_high = ext2fs_swab16 (f->osd2.linux2.l_i_uid_high); t->osd2.linux2.l_i_gid_high = ext2fs_swab16 (f->osd2.linux2.l_i_gid_high); t->osd2.linux2.l_i_reserved2 = ext2fs_swab32(f->osd2.linux2.l_i_reserved2); break; case EXT2_OS_HURD: t->osd1.hurd1.h_i_translator = ext2fs_swab32 (f->osd1.hurd1.h_i_translator); t->osd2.hurd2.h_i_frag = f->osd2.hurd2.h_i_frag; t->osd2.hurd2.h_i_fsize = f->osd2.hurd2.h_i_fsize; t->osd2.hurd2.h_i_mode_high = ext2fs_swab16 (f->osd2.hurd2.h_i_mode_high); t->osd2.hurd2.h_i_uid_high = ext2fs_swab16 (f->osd2.hurd2.h_i_uid_high); t->osd2.hurd2.h_i_gid_high = ext2fs_swab16 (f->osd2.hurd2.h_i_gid_high); t->osd2.hurd2.h_i_author = ext2fs_swab32 (f->osd2.hurd2.h_i_author); break; default: break; } if (bufsize < (int) (sizeof(struct ext2_inode) + sizeof(__u16))) return; if (hostorder) extra_isize = f->i_extra_isize; t->i_extra_isize = ext2fs_swab16(f->i_extra_isize); if (!hostorder) extra_isize = t->i_extra_isize; if (extra_isize > EXT2_INODE_SIZE(fs->super) - sizeof(struct ext2_inode)) { return; } i = sizeof(struct ext2_inode) + extra_isize + sizeof(__u32); if (bufsize < (int) i) return; eaf = (__u32 *) (((char *) f) + sizeof(struct ext2_inode) + extra_isize); attr_magic = *eaf; if (!hostorder) attr_magic = ext2fs_swab32(attr_magic); if (attr_magic != EXT2_EXT_ATTR_MAGIC) return; eat = (__u32 *) (((char *) t) + sizeof(struct ext2_inode) + extra_isize); *eat = ext2fs_swab32(*eaf); ext2fs_swap_ext_attr((char *) (eat + 1), (char *) (eaf + 1), bufsize - sizeof(struct ext2_inode) - extra_isize - sizeof(__u32), 0); }
void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t, struct ext2_inode_large *f, int hostorder, int bufsize) { unsigned i; int islnk = 0; __u32 *eaf, *eat; if (hostorder && LINUX_S_ISLNK(f->i_mode)) islnk = 1; t->i_mode = ext2fs_swab16(f->i_mode); if (!hostorder && LINUX_S_ISLNK(t->i_mode)) islnk = 1; t->i_uid = ext2fs_swab16(f->i_uid); t->i_size = ext2fs_swab32(f->i_size); t->i_atime = ext2fs_swab32(f->i_atime); t->i_ctime = ext2fs_swab32(f->i_ctime); t->i_mtime = ext2fs_swab32(f->i_mtime); t->i_dtime = ext2fs_swab32(f->i_dtime); t->i_gid = ext2fs_swab16(f->i_gid); t->i_links_count = ext2fs_swab16(f->i_links_count); t->i_blocks = ext2fs_swab32(f->i_blocks); t->i_flags = ext2fs_swab32(f->i_flags); t->i_file_acl = ext2fs_swab32(f->i_file_acl); t->i_dir_acl = ext2fs_swab32(f->i_dir_acl); if (!islnk || ext2fs_inode_data_blocks(fs, (struct ext2_inode *)t)) { for (i = 0; i < EXT2_N_BLOCKS; i++) t->i_block[i] = ext2fs_swab32(f->i_block[i]); } else if (t != f) { for (i = 0; i < EXT2_N_BLOCKS; i++) t->i_block[i] = f->i_block[i]; } t->i_generation = ext2fs_swab32(f->i_generation); t->i_faddr = ext2fs_swab32(f->i_faddr); switch (fs->super->s_creator_os) { case EXT2_OS_LINUX: t->osd1.linux1.l_i_reserved1 = ext2fs_swab32(f->osd1.linux1.l_i_reserved1); t->osd2.linux2.l_i_frag = f->osd2.linux2.l_i_frag; t->osd2.linux2.l_i_fsize = f->osd2.linux2.l_i_fsize; t->osd2.linux2.i_pad1 = ext2fs_swab16(f->osd2.linux2.i_pad1); t->osd2.linux2.l_i_uid_high = ext2fs_swab16 (f->osd2.linux2.l_i_uid_high); t->osd2.linux2.l_i_gid_high = ext2fs_swab16 (f->osd2.linux2.l_i_gid_high); t->osd2.linux2.l_i_reserved2 = ext2fs_swab32(f->osd2.linux2.l_i_reserved2); break; case EXT2_OS_HURD: t->osd1.hurd1.h_i_translator = ext2fs_swab32 (f->osd1.hurd1.h_i_translator); t->osd2.hurd2.h_i_frag = f->osd2.hurd2.h_i_frag; t->osd2.hurd2.h_i_fsize = f->osd2.hurd2.h_i_fsize; t->osd2.hurd2.h_i_mode_high = ext2fs_swab16 (f->osd2.hurd2.h_i_mode_high); t->osd2.hurd2.h_i_uid_high = ext2fs_swab16 (f->osd2.hurd2.h_i_uid_high); t->osd2.hurd2.h_i_gid_high = ext2fs_swab16 (f->osd2.hurd2.h_i_gid_high); t->osd2.hurd2.h_i_author = ext2fs_swab32 (f->osd2.hurd2.h_i_author); break; case EXT2_OS_MASIX: t->osd1.masix1.m_i_reserved1 = ext2fs_swab32(f->osd1.masix1.m_i_reserved1); t->osd2.masix2.m_i_frag = f->osd2.masix2.m_i_frag; t->osd2.masix2.m_i_fsize = f->osd2.masix2.m_i_fsize; t->osd2.masix2.m_pad1 = ext2fs_swab16(f->osd2.masix2.m_pad1); t->osd2.masix2.m_i_reserved2[0] = ext2fs_swab32(f->osd2.masix2.m_i_reserved2[0]); t->osd2.masix2.m_i_reserved2[1] = ext2fs_swab32(f->osd2.masix2.m_i_reserved2[1]); break; } if (bufsize < (int) (sizeof(struct ext2_inode) + sizeof(__u16))) return; /* no i_extra_isize field */ t->i_extra_isize = ext2fs_swab16(f->i_extra_isize); if (t->i_extra_isize > EXT2_INODE_SIZE(fs->super) - sizeof(struct ext2_inode)) { /* this is error case: i_extra_size is too large */ return; } i = sizeof(struct ext2_inode) + t->i_extra_isize + sizeof(__u32); if (bufsize < (int) i) return; /* no space for EA magic */ eaf = (__u32 *) (((char *) f) + sizeof(struct ext2_inode) + f->i_extra_isize); if (ext2fs_swab32(*eaf) != EXT2_EXT_ATTR_MAGIC) return; /* it seems no magic here */ eat = (__u32 *) (((char *) t) + sizeof(struct ext2_inode) + f->i_extra_isize); *eat = ext2fs_swab32(*eaf); /* convert EA(s) */ ext2fs_swap_ext_attr((char *) (eat + 1), (char *) (eaf + 1), bufsize - sizeof(struct ext2_inode) - t->i_extra_isize - sizeof(__u32), 0); }