ext2fs_bswap.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /* $OpenBSD: ext2fs_bswap.c,v 1.8 2014/07/31 17:37:52 pelikan Exp $ */
  2. /* $NetBSD: ext2fs_bswap.c,v 1.6 2000/07/24 00:23:10 mycroft Exp $ */
  3. /*
  4. * Copyright (c) 1997 Manuel Bouyer.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  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.
  14. * 3. All advertising materials mentioning features or use of this software
  15. * must display the following acknowledgement:
  16. * This product includes software developed by the University of
  17. * California, Berkeley and its contributors.
  18. * 4. Neither the name of the University nor the names of its contributors
  19. * may be used to endorse or promote products derived from this software
  20. * without specific prior written permission.
  21. *
  22. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  23. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  24. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  25. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  26. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  27. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  28. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  29. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  30. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  31. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  32. *
  33. */
  34. #include <sys/types.h>
  35. #if defined(_KERNEL)
  36. #include <sys/systm.h>
  37. #endif
  38. #include <ufs/ext2fs/ext2fs.h>
  39. #include <ufs/ext2fs/ext2fs_dinode.h>
  40. #if !defined(_KERNEL)
  41. #include <string.h>
  42. #endif
  43. /* These functions are only needed if native byte order is not big endian */
  44. #if BYTE_ORDER == BIG_ENDIAN
  45. void
  46. e2fs_sb_bswap(struct ext2fs *old, struct ext2fs *new)
  47. {
  48. /* preserve unused fields */
  49. memcpy(new, old, sizeof(struct ext2fs));
  50. new->e2fs_icount = swap32(old->e2fs_icount);
  51. new->e2fs_bcount = swap32(old->e2fs_bcount);
  52. new->e2fs_rbcount = swap32(old->e2fs_rbcount);
  53. new->e2fs_fbcount = swap32(old->e2fs_fbcount);
  54. new->e2fs_ficount = swap32(old->e2fs_ficount);
  55. new->e2fs_first_dblock = swap32(old->e2fs_first_dblock);
  56. new->e2fs_log_bsize = swap32(old->e2fs_log_bsize);
  57. new->e2fs_log_fsize = swap32(old->e2fs_log_fsize);
  58. new->e2fs_bpg = swap32(old->e2fs_bpg);
  59. new->e2fs_fpg = swap32(old->e2fs_fpg);
  60. new->e2fs_ipg = swap32(old->e2fs_ipg);
  61. new->e2fs_mtime = swap32(old->e2fs_mtime);
  62. new->e2fs_wtime = swap32(old->e2fs_wtime);
  63. new->e2fs_mnt_count = swap16(old->e2fs_mnt_count);
  64. new->e2fs_max_mnt_count = swap16(old->e2fs_max_mnt_count);
  65. new->e2fs_magic = swap16(old->e2fs_magic);
  66. new->e2fs_state = swap16(old->e2fs_state);
  67. new->e2fs_beh = swap16(old->e2fs_beh);
  68. new->e2fs_minrev = swap16(old->e2fs_minrev);
  69. new->e2fs_lastfsck = swap32(old->e2fs_lastfsck);
  70. new->e2fs_fsckintv = swap32(old->e2fs_fsckintv);
  71. new->e2fs_creator = swap32(old->e2fs_creator);
  72. new->e2fs_rev = swap32(old->e2fs_rev);
  73. new->e2fs_ruid = swap16(old->e2fs_ruid);
  74. new->e2fs_rgid = swap16(old->e2fs_rgid);
  75. new->e2fs_first_ino = swap32(old->e2fs_first_ino);
  76. new->e2fs_inode_size = swap16(old->e2fs_inode_size);
  77. new->e2fs_block_group_nr = swap16(old->e2fs_block_group_nr);
  78. new->e2fs_features_compat = swap32(old->e2fs_features_compat);
  79. new->e2fs_features_incompat = swap32(old->e2fs_features_incompat);
  80. new->e2fs_features_rocompat = swap32(old->e2fs_features_rocompat);
  81. new->e2fs_algo = swap32(old->e2fs_algo);
  82. /* SOME journaling-related fields. */
  83. new->e2fs_journal_ino = swap32(old->e2fs_journal_ino);
  84. new->e2fs_journal_dev = swap32(old->e2fs_journal_dev);
  85. new->e2fs_last_orphan = swap32(old->e2fs_last_orphan);
  86. new->e2fs_gdesc_size = swap16(old->e2fs_gdesc_size);
  87. new->e2fs_default_mount_opts = swap32(old->e2fs_default_mount_opts);
  88. new->e2fs_first_meta_bg = swap32(old->e2fs_first_meta_bg);
  89. new->e2fs_mkfs_time = swap32(old->e2fs_mkfs_time);
  90. }
  91. void
  92. e2fs_cg_bswap(struct ext2_gd *old, struct ext2_gd *new, int size)
  93. {
  94. int i;
  95. for (i=0; i < (size / sizeof(struct ext2_gd)); i++) {
  96. new[i].ext2bgd_b_bitmap = swap32(old[i].ext2bgd_b_bitmap);
  97. new[i].ext2bgd_i_bitmap = swap32(old[i].ext2bgd_i_bitmap);
  98. new[i].ext2bgd_i_tables = swap32(old[i].ext2bgd_i_tables);
  99. new[i].ext2bgd_nbfree = swap16(old[i].ext2bgd_nbfree);
  100. new[i].ext2bgd_nifree = swap16(old[i].ext2bgd_nifree);
  101. new[i].ext2bgd_ndirs = swap16(old[i].ext2bgd_ndirs);
  102. }
  103. }
  104. void
  105. e2fs_i_bswap(struct m_ext2fs *fs, struct ext2fs_dinode *old,
  106. struct ext2fs_dinode *new)
  107. {
  108. new->e2di_mode = swap16(old->e2di_mode);
  109. new->e2di_uid_low = swap16(old->e2di_uid_low);
  110. new->e2di_gid_low = swap16(old->e2di_gid_low);
  111. new->e2di_uid_high = swap16(old->e2di_uid_high);
  112. new->e2di_gid_high = swap16(old->e2di_gid_high);
  113. new->e2di_nlink = swap16(old->e2di_nlink);
  114. new->e2di_size = swap32(old->e2di_size);
  115. new->e2di_atime = swap32(old->e2di_atime);
  116. new->e2di_ctime = swap32(old->e2di_ctime);
  117. new->e2di_mtime = swap32(old->e2di_mtime);
  118. new->e2di_dtime = swap32(old->e2di_dtime);
  119. new->e2di_nblock = swap32(old->e2di_nblock);
  120. new->e2di_flags = swap32(old->e2di_flags);
  121. new->e2di_gen = swap32(old->e2di_gen);
  122. new->e2di_facl = swap32(old->e2di_facl);
  123. new->e2di_size_hi = swap32(old->e2di_size_hi);
  124. new->e2di_faddr = swap32(old->e2di_faddr);
  125. new->e2di_nblock_hi = swap16(old->e2di_nblock_hi);
  126. new->e2di_facl_hi = swap16(old->e2di_facl_hi);
  127. memcpy(&new->e2di_blocks[0], &old->e2di_blocks[0],
  128. (NDADDR+NIADDR) * sizeof(int));
  129. if (EXT2_DINODE_SIZE(fs) <= EXT2_REV0_DINODE_SIZE)
  130. return;
  131. new->e2di_isize = swap16(old->e2di_isize);
  132. }
  133. #endif