Home | History | Annotate | Download | only in squashfs-tools
      1 #ifndef SQUASHFS_SWAP_H
      2 #define SQUASHFS_SWAP_H
      3 /*
      4  * Squashfs
      5  *
      6  * Copyright (c) 2008, 2009, 2010, 2013, 2014
      7  * Phillip Lougher <phillip (at) squashfs.org.uk>
      8  *
      9  * This program is free software; you can redistribute it and/or
     10  * modify it under the terms of the GNU General Public License
     11  * as published by the Free Software Foundation; either version 2,
     12  * or (at your option) any later version.
     13  *
     14  * This program is distributed in the hope that it will be useful,
     15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17  * GNU General Public License for more details.
     18  *
     19  * You should have received a copy of the GNU General Public License
     20  * along with this program; if not, write to the Free Software
     21  * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     22  *
     23  * squashfs_swap.h
     24  */
     25 
     26 /*
     27  * macros to convert each stucture from big endian to little endian
     28  */
     29 
     30 #if __BYTE_ORDER == __BIG_ENDIAN
     31 #include <stddef.h>
     32 extern void swap_le16(void *, void *);
     33 extern void swap_le32(void *, void *);
     34 extern void swap_le64(void *, void *);
     35 extern void swap_le16_num(void *, void *, int);
     36 extern void swap_le32_num(void *, void *, int);
     37 extern void swap_le64_num(void *, void *, int);
     38 extern unsigned short inswap_le16(unsigned short);
     39 extern unsigned int inswap_le32(unsigned int);
     40 extern long long inswap_le64(long long);
     41 extern void inswap_le16_num(unsigned short *, int);
     42 extern void inswap_le32_num(unsigned int *, int);
     43 extern void inswap_le64_num(long long *, int);
     44 
     45 #define _SQUASHFS_SWAP_SUPER_BLOCK(s, d, SWAP_FUNC) {\
     46 	SWAP_FUNC(32, s, d, s_magic, struct squashfs_super_block);\
     47 	SWAP_FUNC(32, s, d, inodes, struct squashfs_super_block);\
     48 	SWAP_FUNC##S(32, s, d, mkfs_time, struct squashfs_super_block);\
     49 	SWAP_FUNC(32, s, d, block_size, struct squashfs_super_block);\
     50 	SWAP_FUNC(32, s, d, fragments, struct squashfs_super_block);\
     51 	SWAP_FUNC(16, s, d, compression, struct squashfs_super_block);\
     52 	SWAP_FUNC(16, s, d, block_log, struct squashfs_super_block);\
     53 	SWAP_FUNC(16, s, d, flags, struct squashfs_super_block);\
     54 	SWAP_FUNC(16, s, d, no_ids, struct squashfs_super_block);\
     55 	SWAP_FUNC(16, s, d, s_major, struct squashfs_super_block);\
     56 	SWAP_FUNC(16, s, d, s_minor, struct squashfs_super_block);\
     57 	SWAP_FUNC(64, s, d, root_inode, struct squashfs_super_block);\
     58 	SWAP_FUNC(64, s, d, bytes_used, struct squashfs_super_block);\
     59 	SWAP_FUNC(64, s, d, id_table_start, struct squashfs_super_block);\
     60 	SWAP_FUNC(64, s, d, xattr_id_table_start, struct squashfs_super_block);\
     61 	SWAP_FUNC(64, s, d, inode_table_start, struct squashfs_super_block);\
     62 	SWAP_FUNC(64, s, d, directory_table_start, struct squashfs_super_block);\
     63 	SWAP_FUNC(64, s, d, fragment_table_start, struct squashfs_super_block);\
     64 	SWAP_FUNC(64, s, d, lookup_table_start, struct squashfs_super_block);\
     65 }
     66 
     67 #define _SQUASHFS_SWAP_DIR_INDEX(s, d, SWAP_FUNC) {\
     68 	SWAP_FUNC(32, s, d, index, struct squashfs_dir_index);\
     69 	SWAP_FUNC(32, s, d, start_block, struct squashfs_dir_index);\
     70 	SWAP_FUNC(32, s, d, size, struct squashfs_dir_index);\
     71 }
     72 
     73 #define _SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, SWAP_FUNC) {\
     74 	SWAP_FUNC(16, s, d, inode_type, struct squashfs_base_inode_header);\
     75 	SWAP_FUNC(16, s, d, mode, struct squashfs_base_inode_header);\
     76 	SWAP_FUNC(16, s, d, uid, struct squashfs_base_inode_header);\
     77 	SWAP_FUNC(16, s, d, guid, struct squashfs_base_inode_header);\
     78 	SWAP_FUNC##S(32, s, d, mtime, struct squashfs_base_inode_header);\
     79 	SWAP_FUNC(32, s, d, inode_number, struct squashfs_base_inode_header);\
     80 }
     81 
     82 #define _SQUASHFS_SWAP_IPC_INODE_HEADER(s, d, SWAP_FUNC) {\
     83 	SWAP_FUNC(16, s, d, inode_type, struct squashfs_ipc_inode_header);\
     84 	SWAP_FUNC(16, s, d, mode, struct squashfs_ipc_inode_header);\
     85 	SWAP_FUNC(16, s, d, uid, struct squashfs_ipc_inode_header);\
     86 	SWAP_FUNC(16, s, d, guid, struct squashfs_ipc_inode_header);\
     87 	SWAP_FUNC##S(32, s, d, mtime, struct squashfs_ipc_inode_header);\
     88 	SWAP_FUNC(32, s, d, inode_number, struct squashfs_ipc_inode_header);\
     89 	SWAP_FUNC(32, s, d, nlink, struct squashfs_ipc_inode_header);\
     90 }
     91 
     92 #define _SQUASHFS_SWAP_LIPC_INODE_HEADER(s, d, SWAP_FUNC) {\
     93 	SWAP_FUNC(16, s, d, inode_type, struct squashfs_lipc_inode_header);\
     94 	SWAP_FUNC(16, s, d, mode, struct squashfs_lipc_inode_header);\
     95 	SWAP_FUNC(16, s, d, uid, struct squashfs_lipc_inode_header);\
     96 	SWAP_FUNC(16, s, d, guid, struct squashfs_lipc_inode_header);\
     97 	SWAP_FUNC##S(32, s, d, mtime, struct squashfs_lipc_inode_header);\
     98 	SWAP_FUNC(32, s, d, inode_number, struct squashfs_lipc_inode_header);\
     99 	SWAP_FUNC(32, s, d, nlink, struct squashfs_lipc_inode_header);\
    100 	SWAP_FUNC(32, s, d, xattr, struct squashfs_lipc_inode_header);\
    101 }
    102 
    103 #define _SQUASHFS_SWAP_DEV_INODE_HEADER(s, d, SWAP_FUNC) {\
    104 	SWAP_FUNC(16, s, d, inode_type, struct squashfs_dev_inode_header);\
    105 	SWAP_FUNC(16, s, d, mode, struct squashfs_dev_inode_header);\
    106 	SWAP_FUNC(16, s, d, uid, struct squashfs_dev_inode_header);\
    107 	SWAP_FUNC(16, s, d, guid, struct squashfs_dev_inode_header);\
    108 	SWAP_FUNC##S(32, s, d, mtime, struct squashfs_dev_inode_header);\
    109 	SWAP_FUNC(32, s, d, inode_number, struct squashfs_dev_inode_header);\
    110 	SWAP_FUNC(32, s, d, nlink, struct squashfs_dev_inode_header);\
    111 	SWAP_FUNC(32, s, d, rdev, struct squashfs_dev_inode_header);\
    112 }
    113 
    114 #define _SQUASHFS_SWAP_LDEV_INODE_HEADER(s, d, SWAP_FUNC) {\
    115 	SWAP_FUNC(16, s, d, inode_type, struct squashfs_ldev_inode_header);\
    116 	SWAP_FUNC(16, s, d, mode, struct squashfs_ldev_inode_header);\
    117 	SWAP_FUNC(16, s, d, uid, struct squashfs_ldev_inode_header);\
    118 	SWAP_FUNC(16, s, d, guid, struct squashfs_ldev_inode_header);\
    119 	SWAP_FUNC##S(32, s, d, mtime, struct squashfs_ldev_inode_header);\
    120 	SWAP_FUNC(32, s, d, inode_number, struct squashfs_ldev_inode_header);\
    121 	SWAP_FUNC(32, s, d, nlink, struct squashfs_ldev_inode_header);\
    122 	SWAP_FUNC(32, s, d, rdev, struct squashfs_ldev_inode_header);\
    123 	SWAP_FUNC(32, s, d, xattr, struct squashfs_ldev_inode_header);\
    124 }
    125 
    126 #define _SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, d, SWAP_FUNC) {\
    127 	SWAP_FUNC(16, s, d, inode_type, struct squashfs_symlink_inode_header);\
    128 	SWAP_FUNC(16, s, d, mode, struct squashfs_symlink_inode_header);\
    129 	SWAP_FUNC(16, s, d, uid, struct squashfs_symlink_inode_header);\
    130 	SWAP_FUNC(16, s, d, guid, struct squashfs_symlink_inode_header);\
    131 	SWAP_FUNC##S(32, s, d, mtime, struct squashfs_symlink_inode_header);\
    132 	SWAP_FUNC(32, s, d, inode_number, struct squashfs_symlink_inode_header);\
    133 	SWAP_FUNC(32, s, d, nlink, struct squashfs_symlink_inode_header);\
    134 	SWAP_FUNC(32, s, d, symlink_size, struct squashfs_symlink_inode_header);\
    135 }
    136 
    137 #define _SQUASHFS_SWAP_REG_INODE_HEADER(s, d, SWAP_FUNC) {\
    138 	SWAP_FUNC(16, s, d, inode_type, struct squashfs_reg_inode_header);\
    139 	SWAP_FUNC(16, s, d, mode, struct squashfs_reg_inode_header);\
    140 	SWAP_FUNC(16, s, d, uid, struct squashfs_reg_inode_header);\
    141 	SWAP_FUNC(16, s, d, guid, struct squashfs_reg_inode_header);\
    142 	SWAP_FUNC##S(32, s, d, mtime, struct squashfs_reg_inode_header);\
    143 	SWAP_FUNC(32, s, d, inode_number, struct squashfs_reg_inode_header);\
    144 	SWAP_FUNC(32, s, d, start_block, struct squashfs_reg_inode_header);\
    145 	SWAP_FUNC(32, s, d, fragment, struct squashfs_reg_inode_header);\
    146 	SWAP_FUNC(32, s, d, offset, struct squashfs_reg_inode_header);\
    147 	SWAP_FUNC(32, s, d, file_size, struct squashfs_reg_inode_header);\
    148 }
    149 
    150 #define _SQUASHFS_SWAP_LREG_INODE_HEADER(s, d, SWAP_FUNC) {\
    151 	SWAP_FUNC(16, s, d, inode_type, struct squashfs_lreg_inode_header);\
    152 	SWAP_FUNC(16, s, d, mode, struct squashfs_lreg_inode_header);\
    153 	SWAP_FUNC(16, s, d, uid, struct squashfs_lreg_inode_header);\
    154 	SWAP_FUNC(16, s, d, guid, struct squashfs_lreg_inode_header);\
    155 	SWAP_FUNC##S(32, s, d, mtime, struct squashfs_lreg_inode_header);\
    156 	SWAP_FUNC(32, s, d, inode_number, struct squashfs_lreg_inode_header);\
    157 	SWAP_FUNC(64, s, d, start_block, struct squashfs_lreg_inode_header);\
    158 	SWAP_FUNC(64, s, d, file_size, struct squashfs_lreg_inode_header);\
    159 	SWAP_FUNC(64, s, d, sparse, struct squashfs_lreg_inode_header);\
    160 	SWAP_FUNC(32, s, d, nlink, struct squashfs_lreg_inode_header);\
    161 	SWAP_FUNC(32, s, d, fragment, struct squashfs_lreg_inode_header);\
    162 	SWAP_FUNC(32, s, d, offset, struct squashfs_lreg_inode_header);\
    163 	SWAP_FUNC(32, s, d, xattr, struct squashfs_lreg_inode_header);\
    164 }
    165 
    166 #define _SQUASHFS_SWAP_DIR_INODE_HEADER(s, d, SWAP_FUNC) {\
    167 	SWAP_FUNC(16, s, d, inode_type, struct squashfs_dir_inode_header);\
    168 	SWAP_FUNC(16, s, d, mode, struct squashfs_dir_inode_header);\
    169 	SWAP_FUNC(16, s, d, uid, struct squashfs_dir_inode_header);\
    170 	SWAP_FUNC(16, s, d, guid, struct squashfs_dir_inode_header);\
    171 	SWAP_FUNC##S(32, s, d, mtime, struct squashfs_dir_inode_header);\
    172 	SWAP_FUNC(32, s, d, inode_number, struct squashfs_dir_inode_header);\
    173 	SWAP_FUNC(32, s, d, start_block, struct squashfs_dir_inode_header);\
    174 	SWAP_FUNC(32, s, d, nlink, struct squashfs_dir_inode_header);\
    175 	SWAP_FUNC(16, s, d, file_size, struct squashfs_dir_inode_header);\
    176 	SWAP_FUNC(16, s, d, offset, struct squashfs_dir_inode_header);\
    177 	SWAP_FUNC(32, s, d, parent_inode, struct squashfs_dir_inode_header);\
    178 }
    179 
    180 #define _SQUASHFS_SWAP_LDIR_INODE_HEADER(s, d, SWAP_FUNC) {\
    181 	SWAP_FUNC(16, s, d, inode_type, struct squashfs_ldir_inode_header);\
    182 	SWAP_FUNC(16, s, d, mode, struct squashfs_ldir_inode_header);\
    183 	SWAP_FUNC(16, s, d, uid, struct squashfs_ldir_inode_header);\
    184 	SWAP_FUNC(16, s, d, guid, struct squashfs_ldir_inode_header);\
    185 	SWAP_FUNC##S(32, s, d, mtime, struct squashfs_ldir_inode_header);\
    186 	SWAP_FUNC(32, s, d, inode_number, struct squashfs_ldir_inode_header);\
    187 	SWAP_FUNC(32, s, d, nlink, struct squashfs_ldir_inode_header);\
    188 	SWAP_FUNC(32, s, d, file_size, struct squashfs_ldir_inode_header);\
    189 	SWAP_FUNC(32, s, d, start_block, struct squashfs_ldir_inode_header);\
    190 	SWAP_FUNC(32, s, d, parent_inode, struct squashfs_ldir_inode_header);\
    191 	SWAP_FUNC(16, s, d, i_count, struct squashfs_ldir_inode_header);\
    192 	SWAP_FUNC(16, s, d, offset, struct squashfs_ldir_inode_header);\
    193 	SWAP_FUNC(32, s, d, xattr, struct squashfs_ldir_inode_header);\
    194 }
    195 
    196 #define _SQUASHFS_SWAP_DIR_ENTRY(s, d, SWAP_FUNC) {\
    197 	SWAP_FUNC(16, s, d, offset, struct squashfs_dir_entry);\
    198 	SWAP_FUNC##S(16, s, d, inode_number, struct squashfs_dir_entry);\
    199 	SWAP_FUNC(16, s, d, type, struct squashfs_dir_entry);\
    200 	SWAP_FUNC(16, s, d, size, struct squashfs_dir_entry);\
    201 }
    202 
    203 #define _SQUASHFS_SWAP_DIR_HEADER(s, d, SWAP_FUNC) {\
    204 	SWAP_FUNC(32, s, d, count, struct squashfs_dir_header);\
    205 	SWAP_FUNC(32, s, d, start_block, struct squashfs_dir_header);\
    206 	SWAP_FUNC(32, s, d, inode_number, struct squashfs_dir_header);\
    207 }
    208 
    209 #define _SQUASHFS_SWAP_FRAGMENT_ENTRY(s, d, SWAP_FUNC) {\
    210 	SWAP_FUNC(64, s, d, start_block, struct squashfs_fragment_entry);\
    211 	SWAP_FUNC(32, s, d, size, struct squashfs_fragment_entry);\
    212 }
    213 
    214 #define _SQUASHFS_SWAP_XATTR_ENTRY(s, d, SWAP_FUNC) {\
    215 	SWAP_FUNC(16, s, d, type, struct squashfs_xattr_entry);\
    216 	SWAP_FUNC(16, s, d, size, struct squashfs_xattr_entry);\
    217 }
    218 
    219 #define _SQUASHFS_SWAP_XATTR_VAL(s, d, SWAP_FUNC) {\
    220 	SWAP_FUNC(32, s, d, vsize, struct squashfs_xattr_val);\
    221 }
    222 
    223 #define _SQUASHFS_SWAP_XATTR_ID(s, d, SWAP_FUNC) {\
    224 	SWAP_FUNC(64, s, d, xattr, struct squashfs_xattr_id);\
    225 	SWAP_FUNC(32, s, d, count, struct squashfs_xattr_id);\
    226 	SWAP_FUNC(32, s, d, size, struct squashfs_xattr_id);\
    227 }
    228 
    229 #define _SQUASHFS_SWAP_XATTR_TABLE(s, d, SWAP_FUNC) {\
    230 	SWAP_FUNC(64, s, d, xattr_table_start, struct squashfs_xattr_table);\
    231 	SWAP_FUNC(32, s, d, xattr_ids, struct squashfs_xattr_table);\
    232 }
    233 
    234 /* big endian architecture copy and swap macros */
    235 #define SQUASHFS_SWAP_SUPER_BLOCK(s, d)	\
    236 			_SQUASHFS_SWAP_SUPER_BLOCK(s, d, SWAP_LE)
    237 #define SQUASHFS_SWAP_DIR_INDEX(s, d) \
    238 			_SQUASHFS_SWAP_DIR_INDEX(s, d, SWAP_LE)
    239 #define SQUASHFS_SWAP_BASE_INODE_HEADER(s, d) \
    240 			_SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, SWAP_LE)
    241 #define SQUASHFS_SWAP_IPC_INODE_HEADER(s, d) \
    242 			_SQUASHFS_SWAP_IPC_INODE_HEADER(s, d, SWAP_LE)
    243 #define SQUASHFS_SWAP_LIPC_INODE_HEADER(s, d) \
    244 			_SQUASHFS_SWAP_LIPC_INODE_HEADER(s, d, SWAP_LE)
    245 #define SQUASHFS_SWAP_DEV_INODE_HEADER(s, d) \
    246 			_SQUASHFS_SWAP_DEV_INODE_HEADER(s, d, SWAP_LE)
    247 #define SQUASHFS_SWAP_LDEV_INODE_HEADER(s, d) \
    248 			_SQUASHFS_SWAP_LDEV_INODE_HEADER(s, d, SWAP_LE)
    249 #define SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, d) \
    250 			_SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, d, SWAP_LE)
    251 #define SQUASHFS_SWAP_REG_INODE_HEADER(s, d) \
    252 			_SQUASHFS_SWAP_REG_INODE_HEADER(s, d, SWAP_LE)
    253 #define SQUASHFS_SWAP_LREG_INODE_HEADER(s, d) \
    254 			_SQUASHFS_SWAP_LREG_INODE_HEADER(s, d, SWAP_LE)
    255 #define SQUASHFS_SWAP_DIR_INODE_HEADER(s, d) \
    256 			_SQUASHFS_SWAP_DIR_INODE_HEADER(s, d, SWAP_LE)
    257 #define SQUASHFS_SWAP_LDIR_INODE_HEADER(s, d) \
    258 			_SQUASHFS_SWAP_LDIR_INODE_HEADER(s, d, SWAP_LE)
    259 #define SQUASHFS_SWAP_DIR_ENTRY(s, d) \
    260 			_SQUASHFS_SWAP_DIR_ENTRY(s, d, SWAP_LE)
    261 #define SQUASHFS_SWAP_DIR_HEADER(s, d) \
    262 			_SQUASHFS_SWAP_DIR_HEADER(s, d, SWAP_LE)
    263 #define SQUASHFS_SWAP_FRAGMENT_ENTRY(s, d) \
    264 			_SQUASHFS_SWAP_FRAGMENT_ENTRY(s, d, SWAP_LE)
    265 #define SQUASHFS_SWAP_XATTR_ENTRY(s, d) \
    266 			 _SQUASHFS_SWAP_XATTR_ENTRY(s, d, SWAP_LE)
    267 #define SQUASHFS_SWAP_XATTR_VAL(s, d) \
    268 			_SQUASHFS_SWAP_XATTR_VAL(s, d, SWAP_LE)
    269 #define SQUASHFS_SWAP_XATTR_ID(s, d) \
    270 			 _SQUASHFS_SWAP_XATTR_ID(s, d, SWAP_LE)
    271 #define SQUASHFS_SWAP_XATTR_TABLE(s, d) \
    272 			_SQUASHFS_SWAP_XATTR_TABLE(s, d, SWAP_LE)
    273 #define SWAP_LE(bits, s, d, field, type) \
    274 			SWAP_LE##bits(((void *)(s)) + offsetof(type, field), \
    275 				((void *)(d)) + offsetof(type, field))
    276 #define SWAP_LES(bits, s, d, field, type) \
    277 			SWAP_LE(bits, s, d, field, type)
    278 #define SQUASHFS_SWAP_INODE_T(s, d) SQUASHFS_SWAP_LONG_LONGS(s, d, 1)
    279 #define SQUASHFS_SWAP_FRAGMENT_INDEXES(s, d, n) \
    280 			SQUASHFS_SWAP_LONG_LONGS(s, d, n)
    281 #define SQUASHFS_SWAP_LOOKUP_BLOCKS(s, d, n) SQUASHFS_SWAP_LONG_LONGS(s, d, n)
    282 #define SQUASHFS_SWAP_ID_BLOCKS(s, d, n) SQUASHFS_SWAP_LONG_LONGS(s, d, n)
    283 
    284 #define SQUASHFS_SWAP_SHORTS(s, d, n) swap_le16_num(s, d, n)
    285 #define SQUASHFS_SWAP_INTS(s, d, n) swap_le32_num(s, d, n)
    286 #define SQUASHFS_SWAP_LONG_LONGS(s, d, n) swap_le64_num(s, d, n)
    287 
    288 #define SWAP_LE16(s, d)		swap_le16(s, d)
    289 #define SWAP_LE32(s, d)		swap_le32(s, d)
    290 #define SWAP_LE64(s, d)		swap_le64(s, d)
    291 
    292 /* big endian architecture swap in-place macros */
    293 #define SQUASHFS_INSWAP_SUPER_BLOCK(s) \
    294 			_SQUASHFS_SWAP_SUPER_BLOCK(s, s, INSWAP_LE)
    295 #define SQUASHFS_INSWAP_DIR_INDEX(s) \
    296 			_SQUASHFS_SWAP_DIR_INDEX(s, s, INSWAP_LE)
    297 #define SQUASHFS_INSWAP_BASE_INODE_HEADER(s) \
    298 			_SQUASHFS_SWAP_BASE_INODE_HEADER(s, s, INSWAP_LE)
    299 #define SQUASHFS_INSWAP_IPC_INODE_HEADER(s) \
    300 			_SQUASHFS_SWAP_IPC_INODE_HEADER(s, s, INSWAP_LE)
    301 #define SQUASHFS_INSWAP_LIPC_INODE_HEADER(s) \
    302 			_SQUASHFS_SWAP_LIPC_INODE_HEADER(s, s, INSWAP_LE)
    303 #define SQUASHFS_INSWAP_DEV_INODE_HEADER(s) \
    304 			_SQUASHFS_SWAP_DEV_INODE_HEADER(s, s, INSWAP_LE)
    305 #define SQUASHFS_INSWAP_LDEV_INODE_HEADER(s) \
    306 			_SQUASHFS_SWAP_LDEV_INODE_HEADER(s, s, INSWAP_LE)
    307 #define SQUASHFS_INSWAP_SYMLINK_INODE_HEADER(s) \
    308 			_SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, s, INSWAP_LE)
    309 #define SQUASHFS_INSWAP_REG_INODE_HEADER(s) \
    310 			_SQUASHFS_SWAP_REG_INODE_HEADER(s, s, INSWAP_LE)
    311 #define SQUASHFS_INSWAP_LREG_INODE_HEADER(s) \
    312 			_SQUASHFS_SWAP_LREG_INODE_HEADER(s, s, INSWAP_LE)
    313 #define SQUASHFS_INSWAP_DIR_INODE_HEADER(s) \
    314 			_SQUASHFS_SWAP_DIR_INODE_HEADER(s, s, INSWAP_LE)
    315 #define SQUASHFS_INSWAP_LDIR_INODE_HEADER(s) \
    316 			_SQUASHFS_SWAP_LDIR_INODE_HEADER(s, s, INSWAP_LE)
    317 #define SQUASHFS_INSWAP_DIR_ENTRY(s) \
    318 			_SQUASHFS_SWAP_DIR_ENTRY(s, s, INSWAP_LE)
    319 #define SQUASHFS_INSWAP_DIR_HEADER(s) \
    320 			_SQUASHFS_SWAP_DIR_HEADER(s, s, INSWAP_LE)
    321 #define SQUASHFS_INSWAP_FRAGMENT_ENTRY(s) \
    322 			_SQUASHFS_SWAP_FRAGMENT_ENTRY(s, s, INSWAP_LE)
    323 #define SQUASHFS_INSWAP_XATTR_ENTRY(s) \
    324 			 _SQUASHFS_SWAP_XATTR_ENTRY(s, s, INSWAP_LE)
    325 #define SQUASHFS_INSWAP_XATTR_VAL(s) \
    326 			_SQUASHFS_SWAP_XATTR_VAL(s, s, INSWAP_LE)
    327 #define SQUASHFS_INSWAP_XATTR_ID(s) \
    328 			 _SQUASHFS_SWAP_XATTR_ID(s, s, INSWAP_LE)
    329 #define SQUASHFS_INSWAP_XATTR_TABLE(s) \
    330 			_SQUASHFS_SWAP_XATTR_TABLE(s, s, INSWAP_LE)
    331 #define INSWAP_LE(bits, s, d, field, type) \
    332 			(s)->field = inswap_le##bits((s)->field)
    333 #define INSWAP_LES(bits, s, d, field, type) \
    334 			(s)->field = INSWAP_LES##bits((s)->field)
    335 #define INSWAP_LES16(num) (short) inswap_le16((unsigned short) (num))
    336 #define INSWAP_LES32(num) (int) inswap_le32((unsigned int) (num))
    337 #define SQUASHFS_INSWAP_INODE_T(s) s = inswap_le64(s)
    338 #define SQUASHFS_INSWAP_FRAGMENT_INDEXES(s, n) inswap_le64_num(s, n)
    339 #define SQUASHFS_INSWAP_LOOKUP_BLOCKS(s, n) inswap_le64_num(s, n)
    340 #define SQUASHFS_INSWAP_ID_BLOCKS(s, n) inswap_le64_num(s, n)
    341 #define SQUASHFS_INSWAP_SHORTS(s, n) inswap_le16_num(s, n)
    342 #define SQUASHFS_INSWAP_INTS(s, n) inswap_le32_num(s, n)
    343 #define SQUASHFS_INSWAP_LONG_LONGS(s, n) inswap_le64_num(s, n)
    344 #else
    345 /* little endian architecture, just copy */
    346 #define SQUASHFS_SWAP_SUPER_BLOCK(s, d)	\
    347 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_super_block))
    348 #define SQUASHFS_SWAP_DIR_INDEX(s, d) \
    349 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_dir_index))
    350 #define SQUASHFS_SWAP_BASE_INODE_HEADER(s, d) \
    351 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_base_inode_header))
    352 #define SQUASHFS_SWAP_IPC_INODE_HEADER(s, d) \
    353 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_ipc_inode_header))
    354 #define SQUASHFS_SWAP_LIPC_INODE_HEADER(s, d) \
    355 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_lipc_inode_header))
    356 #define SQUASHFS_SWAP_DEV_INODE_HEADER(s, d) \
    357 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_dev_inode_header))
    358 #define SQUASHFS_SWAP_LDEV_INODE_HEADER(s, d) \
    359 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_ldev_inode_header))
    360 #define SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, d) \
    361 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_symlink_inode_header))
    362 #define SQUASHFS_SWAP_REG_INODE_HEADER(s, d) \
    363 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_reg_inode_header))
    364 #define SQUASHFS_SWAP_LREG_INODE_HEADER(s, d) \
    365 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_lreg_inode_header))
    366 #define SQUASHFS_SWAP_DIR_INODE_HEADER(s, d) \
    367 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_dir_inode_header))
    368 #define SQUASHFS_SWAP_LDIR_INODE_HEADER(s, d) \
    369 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_ldir_inode_header))
    370 #define SQUASHFS_SWAP_DIR_ENTRY(s, d) \
    371 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_dir_entry))
    372 #define SQUASHFS_SWAP_DIR_HEADER(s, d) \
    373 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_dir_header))
    374 #define SQUASHFS_SWAP_FRAGMENT_ENTRY(s, d) \
    375 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_fragment_entry))
    376 #define SQUASHFS_SWAP_XATTR_ENTRY(s, d) \
    377 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_xattr_entry))
    378 #define SQUASHFS_SWAP_XATTR_VAL(s, d) \
    379 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_xattr_val))
    380 #define SQUASHFS_SWAP_XATTR_ID(s, d) \
    381 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_xattr_id))
    382 #define SQUASHFS_SWAP_XATTR_TABLE(s, d) \
    383 		SQUASHFS_MEMCPY(s, d, sizeof(struct squashfs_xattr_table))
    384 #define SQUASHFS_SWAP_INODE_T(s, d) SQUASHFS_SWAP_LONG_LONGS(s, d, 1)
    385 #define SQUASHFS_SWAP_FRAGMENT_INDEXES(s, d, n) \
    386 			SQUASHFS_SWAP_LONG_LONGS(s, d, n)
    387 #define SQUASHFS_SWAP_LOOKUP_BLOCKS(s, d, n) SQUASHFS_SWAP_LONG_LONGS(s, d, n)
    388 #define SQUASHFS_SWAP_ID_BLOCKS(s, d, n) SQUASHFS_SWAP_LONG_LONGS(s, d, n)
    389 
    390 #define SQUASHFS_MEMCPY(s, d, n)	memcpy(d, s, n)
    391 #define SQUASHFS_SWAP_SHORTS(s, d, n)	memcpy(d, s, n * sizeof(short))
    392 #define SQUASHFS_SWAP_INTS(s, d, n)	memcpy(d, s, n * sizeof(int))
    393 #define SQUASHFS_SWAP_LONG_LONGS(s, d, n) \
    394 					memcpy(d, s, n * sizeof(long long))
    395 
    396 /* little endian architecture, data already in place so do nothing */
    397 #define SQUASHFS_INSWAP_SUPER_BLOCK(s)
    398 #define SQUASHFS_INSWAP_DIR_INDEX(s)
    399 #define SQUASHFS_INSWAP_BASE_INODE_HEADER(s)
    400 #define SQUASHFS_INSWAP_IPC_INODE_HEADER(s)
    401 #define SQUASHFS_INSWAP_LIPC_INODE_HEADER(s)
    402 #define SQUASHFS_INSWAP_DEV_INODE_HEADER(s)
    403 #define SQUASHFS_INSWAP_LDEV_INODE_HEADER(s)
    404 #define SQUASHFS_INSWAP_SYMLINK_INODE_HEADER(s)
    405 #define SQUASHFS_INSWAP_REG_INODE_HEADER(s)
    406 #define SQUASHFS_INSWAP_LREG_INODE_HEADER(s)
    407 #define SQUASHFS_INSWAP_DIR_INODE_HEADER(s)
    408 #define SQUASHFS_INSWAP_LDIR_INODE_HEADER(s)
    409 #define SQUASHFS_INSWAP_DIR_ENTRY(s)
    410 #define SQUASHFS_INSWAP_DIR_HEADER(s)
    411 #define SQUASHFS_INSWAP_FRAGMENT_ENTRY(s)
    412 #define SQUASHFS_INSWAP_XATTR_ENTRY(s)
    413 #define SQUASHFS_INSWAP_XATTR_VAL(s)
    414 #define SQUASHFS_INSWAP_XATTR_ID(s)
    415 #define SQUASHFS_INSWAP_XATTR_TABLE(s)
    416 #define SQUASHFS_INSWAP_INODE_T(s)
    417 #define SQUASHFS_INSWAP_FRAGMENT_INDEXES(s, n)
    418 #define SQUASHFS_INSWAP_LOOKUP_BLOCKS(s, n)
    419 #define SQUASHFS_INSWAP_ID_BLOCKS(s, n)
    420 #define SQUASHFS_INSWAP_SHORTS(s, n)
    421 #define SQUASHFS_INSWAP_INTS(s, n)
    422 #define SQUASHFS_INSWAP_LONG_LONGS(s, n)
    423 #endif
    424 #endif
    425