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