1 /* $NetBSD: ext2fs_bswap.c,v 1.19 2013/01/22 09:39:15 dholland Exp $ */
4 * Copyright (c) 1997 Manuel Bouyer.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #include <sys/cdefs.h>
29 __KERNEL_RCSID(0, "$NetBSD: ext2fs_bswap.c,v 1.19 2013/01/22 09:39:15 dholland Exp $");
31 #include <sys/types.h>
32 #include <ufs/ext2fs/ext2fs.h>
33 #include <ufs/ext2fs/ext2fs_dinode.h>
36 #include <sys/systm.h>
41 /* These functions are only needed if native byte order is not little endian */
42 #if BYTE_ORDER == BIG_ENDIAN
44 e2fs_sb_bswap(struct ext2fs
*old
, struct ext2fs
*new)
47 /* preserve unused fields */
48 memcpy(new, old
, sizeof(struct ext2fs
));
49 new->e2fs_icount
= bswap32(old
->e2fs_icount
);
50 new->e2fs_bcount
= bswap32(old
->e2fs_bcount
);
51 new->e2fs_rbcount
= bswap32(old
->e2fs_rbcount
);
52 new->e2fs_fbcount
= bswap32(old
->e2fs_fbcount
);
53 new->e2fs_ficount
= bswap32(old
->e2fs_ficount
);
54 new->e2fs_first_dblock
= bswap32(old
->e2fs_first_dblock
);
55 new->e2fs_log_bsize
= bswap32(old
->e2fs_log_bsize
);
56 new->e2fs_fsize
= bswap32(old
->e2fs_fsize
);
57 new->e2fs_bpg
= bswap32(old
->e2fs_bpg
);
58 new->e2fs_fpg
= bswap32(old
->e2fs_fpg
);
59 new->e2fs_ipg
= bswap32(old
->e2fs_ipg
);
60 new->e2fs_mtime
= bswap32(old
->e2fs_mtime
);
61 new->e2fs_wtime
= bswap32(old
->e2fs_wtime
);
62 new->e2fs_mnt_count
= bswap16(old
->e2fs_mnt_count
);
63 new->e2fs_max_mnt_count
= bswap16(old
->e2fs_max_mnt_count
);
64 new->e2fs_magic
= bswap16(old
->e2fs_magic
);
65 new->e2fs_state
= bswap16(old
->e2fs_state
);
66 new->e2fs_beh
= bswap16(old
->e2fs_beh
);
67 new->e2fs_minrev
= bswap16(old
->e2fs_minrev
);
68 new->e2fs_lastfsck
= bswap32(old
->e2fs_lastfsck
);
69 new->e2fs_fsckintv
= bswap32(old
->e2fs_fsckintv
);
70 new->e2fs_creator
= bswap32(old
->e2fs_creator
);
71 new->e2fs_rev
= bswap32(old
->e2fs_rev
);
72 new->e2fs_ruid
= bswap16(old
->e2fs_ruid
);
73 new->e2fs_rgid
= bswap16(old
->e2fs_rgid
);
74 new->e2fs_first_ino
= bswap32(old
->e2fs_first_ino
);
75 new->e2fs_inode_size
= bswap16(old
->e2fs_inode_size
);
76 new->e2fs_block_group_nr
= bswap16(old
->e2fs_block_group_nr
);
77 new->e2fs_features_compat
= bswap32(old
->e2fs_features_compat
);
78 new->e2fs_features_incompat
= bswap32(old
->e2fs_features_incompat
);
79 new->e2fs_features_rocompat
= bswap32(old
->e2fs_features_rocompat
);
80 new->e2fs_algo
= bswap32(old
->e2fs_algo
);
81 new->e2fs_reserved_ngdb
= bswap16(old
->e2fs_reserved_ngdb
);
84 void e2fs_cg_bswap(struct ext2_gd
*old
, struct ext2_gd
*new, int size
)
88 for (i
= 0; i
< (size
/ (int)sizeof(struct ext2_gd
)); i
++) {
89 new[i
].ext2bgd_b_bitmap
= bswap32(old
[i
].ext2bgd_b_bitmap
);
90 new[i
].ext2bgd_i_bitmap
= bswap32(old
[i
].ext2bgd_i_bitmap
);
91 new[i
].ext2bgd_i_tables
= bswap32(old
[i
].ext2bgd_i_tables
);
92 new[i
].ext2bgd_nbfree
= bswap16(old
[i
].ext2bgd_nbfree
);
93 new[i
].ext2bgd_nifree
= bswap16(old
[i
].ext2bgd_nifree
);
94 new[i
].ext2bgd_ndirs
= bswap16(old
[i
].ext2bgd_ndirs
);
98 void e2fs_i_bswap(struct ext2fs_dinode
*old
, struct ext2fs_dinode
*new)
101 new->e2di_mode
= bswap16(old
->e2di_mode
);
102 new->e2di_uid
= bswap16(old
->e2di_uid
);
103 new->e2di_gid
= bswap16(old
->e2di_gid
);
104 new->e2di_nlink
= bswap16(old
->e2di_nlink
);
105 new->e2di_size
= bswap32(old
->e2di_size
);
106 new->e2di_atime
= bswap32(old
->e2di_atime
);
107 new->e2di_ctime
= bswap32(old
->e2di_ctime
);
108 new->e2di_mtime
= bswap32(old
->e2di_mtime
);
109 new->e2di_dtime
= bswap32(old
->e2di_dtime
);
110 new->e2di_nblock
= bswap32(old
->e2di_nblock
);
111 new->e2di_flags
= bswap32(old
->e2di_flags
);
112 new->e2di_version
= bswap32(old
->e2di_version
);
113 new->e2di_gen
= bswap32(old
->e2di_gen
);
114 new->e2di_facl
= bswap32(old
->e2di_facl
);
115 new->e2di_dacl
= bswap32(old
->e2di_dacl
);
116 new->e2di_faddr
= bswap32(old
->e2di_faddr
);
117 new->e2di_nblock_high
= bswap16(old
->e2di_nblock_high
);
118 new->e2di_facl_high
= bswap16(old
->e2di_facl_high
);
119 new->e2di_uid_high
= bswap16(old
->e2di_uid_high
);
120 new->e2di_gid_high
= bswap16(old
->e2di_gid_high
);
121 memcpy(&new->e2di_blocks
[0], &old
->e2di_blocks
[0],
122 (EXT2FS_NDADDR
+ EXT2FS_NIADDR
) * sizeof(uint32_t));