busybox/e2fsprogs/old_e2fsprogs/ext2fs/swapfs.c
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2/*
   3 * swapfs.c --- swap ext2 filesystem data structures
   4 *
   5 * Copyright (C) 1995, 1996, 2002 Theodore Ts'o.
   6 *
   7 * %Begin-Header%
   8 * This file may be redistributed under the terms of the GNU Public
   9 * License.
  10 * %End-Header%
  11 */
  12
  13#include <stdio.h>
  14#include <unistd.h>
  15#include <string.h>
  16#include <time.h>
  17
  18#include "ext2_fs.h"
  19#include "ext2fs.h"
  20#include "ext2_ext_attr.h"
  21
  22#if BB_BIG_ENDIAN
  23void ext2fs_swap_super(struct ext2_super_block * sb)
  24{
  25        int i;
  26        sb->s_inodes_count = ext2fs_swab32(sb->s_inodes_count);
  27        sb->s_blocks_count = ext2fs_swab32(sb->s_blocks_count);
  28        sb->s_r_blocks_count = ext2fs_swab32(sb->s_r_blocks_count);
  29        sb->s_free_blocks_count = ext2fs_swab32(sb->s_free_blocks_count);
  30        sb->s_free_inodes_count = ext2fs_swab32(sb->s_free_inodes_count);
  31        sb->s_first_data_block = ext2fs_swab32(sb->s_first_data_block);
  32        sb->s_log_block_size = ext2fs_swab32(sb->s_log_block_size);
  33        sb->s_log_frag_size = ext2fs_swab32(sb->s_log_frag_size);
  34        sb->s_blocks_per_group = ext2fs_swab32(sb->s_blocks_per_group);
  35        sb->s_frags_per_group = ext2fs_swab32(sb->s_frags_per_group);
  36        sb->s_inodes_per_group = ext2fs_swab32(sb->s_inodes_per_group);
  37        sb->s_mtime = ext2fs_swab32(sb->s_mtime);
  38        sb->s_wtime = ext2fs_swab32(sb->s_wtime);
  39        sb->s_mnt_count = ext2fs_swab16(sb->s_mnt_count);
  40        sb->s_max_mnt_count = ext2fs_swab16(sb->s_max_mnt_count);
  41        sb->s_magic = ext2fs_swab16(sb->s_magic);
  42        sb->s_state = ext2fs_swab16(sb->s_state);
  43        sb->s_errors = ext2fs_swab16(sb->s_errors);
  44        sb->s_minor_rev_level = ext2fs_swab16(sb->s_minor_rev_level);
  45        sb->s_lastcheck = ext2fs_swab32(sb->s_lastcheck);
  46        sb->s_checkinterval = ext2fs_swab32(sb->s_checkinterval);
  47        sb->s_creator_os = ext2fs_swab32(sb->s_creator_os);
  48        sb->s_rev_level = ext2fs_swab32(sb->s_rev_level);
  49        sb->s_def_resuid = ext2fs_swab16(sb->s_def_resuid);
  50        sb->s_def_resgid = ext2fs_swab16(sb->s_def_resgid);
  51        sb->s_first_ino = ext2fs_swab32(sb->s_first_ino);
  52        sb->s_inode_size = ext2fs_swab16(sb->s_inode_size);
  53        sb->s_block_group_nr = ext2fs_swab16(sb->s_block_group_nr);
  54        sb->s_feature_compat = ext2fs_swab32(sb->s_feature_compat);
  55        sb->s_feature_incompat = ext2fs_swab32(sb->s_feature_incompat);
  56        sb->s_feature_ro_compat = ext2fs_swab32(sb->s_feature_ro_compat);
  57        sb->s_algorithm_usage_bitmap = ext2fs_swab32(sb->s_algorithm_usage_bitmap);
  58        sb->s_reserved_gdt_blocks = ext2fs_swab16(sb->s_reserved_gdt_blocks);
  59        sb->s_journal_inum = ext2fs_swab32(sb->s_journal_inum);
  60        sb->s_journal_dev = ext2fs_swab32(sb->s_journal_dev);
  61        sb->s_last_orphan = ext2fs_swab32(sb->s_last_orphan);
  62        sb->s_default_mount_opts = ext2fs_swab32(sb->s_default_mount_opts);
  63        sb->s_first_meta_bg = ext2fs_swab32(sb->s_first_meta_bg);
  64        sb->s_mkfs_time = ext2fs_swab32(sb->s_mkfs_time);
  65        for (i=0; i < 4; i++)
  66                sb->s_hash_seed[i] = ext2fs_swab32(sb->s_hash_seed[i]);
  67        for (i=0; i < 17; i++)
  68                sb->s_jnl_blocks[i] = ext2fs_swab32(sb->s_jnl_blocks[i]);
  69
  70}
  71
  72void ext2fs_swap_group_desc(struct ext2_group_desc *gdp)
  73{
  74        gdp->bg_block_bitmap = ext2fs_swab32(gdp->bg_block_bitmap);
  75        gdp->bg_inode_bitmap = ext2fs_swab32(gdp->bg_inode_bitmap);
  76        gdp->bg_inode_table = ext2fs_swab32(gdp->bg_inode_table);
  77        gdp->bg_free_blocks_count = ext2fs_swab16(gdp->bg_free_blocks_count);
  78        gdp->bg_free_inodes_count = ext2fs_swab16(gdp->bg_free_inodes_count);
  79        gdp->bg_used_dirs_count = ext2fs_swab16(gdp->bg_used_dirs_count);
  80}
  81
  82void ext2fs_swap_ext_attr(char *to, char *from, int bufsize, int has_header)
  83{
  84        struct ext2_ext_attr_header *from_header =
  85                (struct ext2_ext_attr_header *)from;
  86        struct ext2_ext_attr_header *to_header =
  87                (struct ext2_ext_attr_header *)to;
  88        struct ext2_ext_attr_entry *from_entry, *to_entry;
  89        char *from_end = (char *)from_header + bufsize;
  90        int n;
  91
  92        if (to_header != from_header)
  93                memcpy(to_header, from_header, bufsize);
  94
  95        from_entry = (struct ext2_ext_attr_entry *)from_header;
  96        to_entry   = (struct ext2_ext_attr_entry *)to_header;
  97
  98        if (has_header) {
  99                to_header->h_magic    = ext2fs_swab32(from_header->h_magic);
 100                to_header->h_blocks   = ext2fs_swab32(from_header->h_blocks);
 101                to_header->h_refcount = ext2fs_swab32(from_header->h_refcount);
 102                for (n=0; n<4; n++)
 103                        to_header->h_reserved[n] =
 104                                ext2fs_swab32(from_header->h_reserved[n]);
 105                from_entry = (struct ext2_ext_attr_entry *)(from_header+1);
 106                to_entry   = (struct ext2_ext_attr_entry *)(to_header+1);
 107        }
 108
 109        while ((char *)from_entry < from_end && *(__u32 *)from_entry) {
 110                to_entry->e_value_offs  =
 111                        ext2fs_swab16(from_entry->e_value_offs);
 112                to_entry->e_value_block =
 113                        ext2fs_swab32(from_entry->e_value_block);
 114                to_entry->e_value_size  =
 115                        ext2fs_swab32(from_entry->e_value_size);
 116                from_entry = EXT2_EXT_ATTR_NEXT(from_entry);
 117                to_entry   = EXT2_EXT_ATTR_NEXT(to_entry);
 118        }
 119}
 120
 121void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t,
 122                            struct ext2_inode_large *f, int hostorder,
 123                            int bufsize)
 124{
 125        unsigned i;
 126        int islnk = 0;
 127        __u32 *eaf, *eat;
 128
 129        if (hostorder && LINUX_S_ISLNK(f->i_mode))
 130                islnk = 1;
 131        t->i_mode = ext2fs_swab16(f->i_mode);
 132        if (!hostorder && LINUX_S_ISLNK(t->i_mode))
 133                islnk = 1;
 134        t->i_uid = ext2fs_swab16(f->i_uid);
 135        t->i_size = ext2fs_swab32(f->i_size);
 136        t->i_atime = ext2fs_swab32(f->i_atime);
 137        t->i_ctime = ext2fs_swab32(f->i_ctime);
 138        t->i_mtime = ext2fs_swab32(f->i_mtime);
 139        t->i_dtime = ext2fs_swab32(f->i_dtime);
 140        t->i_gid = ext2fs_swab16(f->i_gid);
 141        t->i_links_count = ext2fs_swab16(f->i_links_count);
 142        t->i_blocks = ext2fs_swab32(f->i_blocks);
 143        t->i_flags = ext2fs_swab32(f->i_flags);
 144        t->i_file_acl = ext2fs_swab32(f->i_file_acl);
 145        t->i_dir_acl = ext2fs_swab32(f->i_dir_acl);
 146        if (!islnk || ext2fs_inode_data_blocks(fs, (struct ext2_inode *)t)) {
 147                for (i = 0; i < EXT2_N_BLOCKS; i++)
 148                        t->i_block[i] = ext2fs_swab32(f->i_block[i]);
 149        } else if (t != f) {
 150                for (i = 0; i < EXT2_N_BLOCKS; i++)
 151                        t->i_block[i] = f->i_block[i];
 152        }
 153        t->i_generation = ext2fs_swab32(f->i_generation);
 154        t->i_faddr = ext2fs_swab32(f->i_faddr);
 155
 156        switch (fs->super->s_creator_os) {
 157        case EXT2_OS_LINUX:
 158                t->osd1.linux1.l_i_reserved1 =
 159                        ext2fs_swab32(f->osd1.linux1.l_i_reserved1);
 160                t->osd2.linux2.l_i_frag = f->osd2.linux2.l_i_frag;
 161                t->osd2.linux2.l_i_fsize = f->osd2.linux2.l_i_fsize;
 162                t->osd2.linux2.i_pad1 = ext2fs_swab16(f->osd2.linux2.i_pad1);
 163                t->osd2.linux2.l_i_uid_high =
 164                  ext2fs_swab16 (f->osd2.linux2.l_i_uid_high);
 165                t->osd2.linux2.l_i_gid_high =
 166                  ext2fs_swab16 (f->osd2.linux2.l_i_gid_high);
 167                t->osd2.linux2.l_i_reserved2 =
 168                        ext2fs_swab32(f->osd2.linux2.l_i_reserved2);
 169                break;
 170        case EXT2_OS_HURD:
 171                t->osd1.hurd1.h_i_translator =
 172                  ext2fs_swab32 (f->osd1.hurd1.h_i_translator);
 173                t->osd2.hurd2.h_i_frag = f->osd2.hurd2.h_i_frag;
 174                t->osd2.hurd2.h_i_fsize = f->osd2.hurd2.h_i_fsize;
 175                t->osd2.hurd2.h_i_mode_high =
 176                  ext2fs_swab16 (f->osd2.hurd2.h_i_mode_high);
 177                t->osd2.hurd2.h_i_uid_high =
 178                  ext2fs_swab16 (f->osd2.hurd2.h_i_uid_high);
 179                t->osd2.hurd2.h_i_gid_high =
 180                  ext2fs_swab16 (f->osd2.hurd2.h_i_gid_high);
 181                t->osd2.hurd2.h_i_author =
 182                  ext2fs_swab32 (f->osd2.hurd2.h_i_author);
 183                break;
 184        case EXT2_OS_MASIX:
 185                t->osd1.masix1.m_i_reserved1 =
 186                        ext2fs_swab32(f->osd1.masix1.m_i_reserved1);
 187                t->osd2.masix2.m_i_frag = f->osd2.masix2.m_i_frag;
 188                t->osd2.masix2.m_i_fsize = f->osd2.masix2.m_i_fsize;
 189                t->osd2.masix2.m_pad1 = ext2fs_swab16(f->osd2.masix2.m_pad1);
 190                t->osd2.masix2.m_i_reserved2[0] =
 191                        ext2fs_swab32(f->osd2.masix2.m_i_reserved2[0]);
 192                t->osd2.masix2.m_i_reserved2[1] =
 193                        ext2fs_swab32(f->osd2.masix2.m_i_reserved2[1]);
 194                break;
 195        }
 196
 197        if (bufsize < (int) (sizeof(struct ext2_inode) + sizeof(__u16)))
 198                return; /* no i_extra_isize field */
 199
 200        t->i_extra_isize = ext2fs_swab16(f->i_extra_isize);
 201        if (t->i_extra_isize > EXT2_INODE_SIZE(fs->super) -
 202                                sizeof(struct ext2_inode)) {
 203                /* this is error case: i_extra_size is too large */
 204                return;
 205        }
 206
 207        i = sizeof(struct ext2_inode) + t->i_extra_isize + sizeof(__u32);
 208        if (bufsize < (int) i)
 209                return; /* no space for EA magic */
 210
 211        eaf = (__u32 *) (((char *) f) + sizeof(struct ext2_inode) +
 212                                        f->i_extra_isize);
 213
 214        if (ext2fs_swab32(*eaf) != EXT2_EXT_ATTR_MAGIC)
 215                return; /* it seems no magic here */
 216
 217        eat = (__u32 *) (((char *) t) + sizeof(struct ext2_inode) +
 218                                        f->i_extra_isize);
 219        *eat = ext2fs_swab32(*eaf);
 220
 221        /* convert EA(s) */
 222        ext2fs_swap_ext_attr((char *) (eat + 1), (char *) (eaf + 1),
 223                             bufsize - sizeof(struct ext2_inode) -
 224                             t->i_extra_isize - sizeof(__u32), 0);
 225
 226}
 227
 228void ext2fs_swap_inode(ext2_filsys fs, struct ext2_inode *t,
 229                       struct ext2_inode *f, int hostorder)
 230{
 231        ext2fs_swap_inode_full(fs, (struct ext2_inode_large *) t,
 232                                (struct ext2_inode_large *) f, hostorder,
 233                                sizeof(struct ext2_inode));
 234}
 235
 236#endif
 237