summaryrefslogtreecommitdiff
path: root/ufs/hyper.c
diff options
context:
space:
mode:
authorMichael I. Bushnell <mib@gnu.org>1996-04-23 15:57:05 +0000
committerMichael I. Bushnell <mib@gnu.org>1996-04-23 15:57:05 +0000
commit976f3e6b59ac2071647c86d884e808af10dd48d4 (patch)
treeada4bc540ff5ade49b4488f6f0cbdeaeab3590eb /ufs/hyper.c
parent932061675dc1b20e7947c6cb4e0bcbd8d5d06d30 (diff)
(swab_sblock, swab_csums): New functions.
(get_hypermetadata): If this is a swapped filesystem, set swab_disk. Also swap csum and sblock after reading them. (diskfs_set_hypermetadata): If swab_disk, swap the csums back before writing them. (copy_sblock): If swab_disk, swap the sblock before writing it.
Diffstat (limited to 'ufs/hyper.c')
-rw-r--r--ufs/hyper.c118
1 files changed, 117 insertions, 1 deletions
diff --git a/ufs/hyper.c b/ufs/hyper.c
index be51b360..283a7e14 100644
--- a/ufs/hyper.c
+++ b/ufs/hyper.c
@@ -30,6 +30,106 @@ struct fs *sblock;
struct csum *csum;
void
+swab_sblock (struct fs *sblock)
+{
+ int i, j;
+
+ sblock->fs_sblkno = swab_long (sblock->fs_sblkno);
+ sblock->fs_cblkno = swab_long (sblock->fs_cblkno);
+ sblock->fs_iblkno = swab_long (sblock->fs_iblkno);
+ sblock->fs_dblkno = swab_long (sblock->fs_dblkno);
+ sblock->fs_cgoffset = swab_long (sblock->fs_cgoffset);
+ sblock->fs_cgmask = swab_long (sblock->fs_cgmask);
+ sblock->fs_time = swab_long (sblock->fs_time);
+ sblock->fs_size = swab_long (sblock->fs_size);
+ sblock->fs_dsize = swab_long (sblock->fs_dsize);
+ sblock->fs_ncg = swab_long (sblock->fs_ncg);
+ sblock->fs_bsize = swab_long (sblock->fs_bsize);
+ sblock->fs_fsize = swab_long (sblock->fs_fsize);
+ sblock->fs_frag = swab_long (sblock->fs_frag);
+ sblock->fs_minfree = swab_long (sblock->fs_minfree);
+ sblock->fs_rotdelay = swab_long (sblock->fs_rotdelay);
+ sblock->fs_rps = swab_long (sblock->fs_rps);
+ sblock->fs_bmask = swab_long (sblock->fs_bmask);
+ sblock->fs_fmask = swab_long (sblock->fs_fmask);
+ sblock->fs_bshift = swab_long (sblock->fs_bshift);
+ sblock->fs_fshift = swab_long (sblock->fs_fshift);
+ sblock->fs_maxcontig = swab_long (sblock->fs_maxcontig);
+ sblock->fs_maxbpg = swab_long (sblock->fs_maxbpg);
+ sblock->fs_fragshift = swab_long (sblock->fs_fragshift);
+ sblock->fs_fsbtodb = swab_long (sblock->fs_fsbtodb);
+ sblock->fs_sbsize = swab_long (sblock->fs_sbsize);
+ sblock->fs_csmask = swab_long (sblock->fs_csmask);
+ sblock->fs_csshift = swab_long (sblock->fs_csshift);
+ sblock->fs_nindir = swab_long (sblock->fs_nindir);
+ sblock->fs_inopb = swab_long (sblock->fs_inopb);
+ sblock->fs_nspf = swab_long (sblock->fs_nspf);
+ sblock->fs_optim = swab_long (sblock->fs_optim);
+ sblock->fs_npsect = swab_long (sblock->fs_npsect);
+ sblock->fs_interleave = swab_long (sblock->fs_interleave);
+ sblock->fs_trackskew = swab_long (sblock->fs_trackskew);
+ sblock->fs_headswitch = swab_long (sblock->fs_headswitch);
+ sblock->fs_trkseek = swab_long (sblock->fs_trkseek);
+ sblock->fs_csaddr = swab_long (sblock->fs_csaddr);
+ sblock->fs_cssize = swab_long (sblock->fs_cssize);
+ sblock->fs_cgsize = swab_long (sblock->fs_cgsize);
+ sblock->fs_ntrak = swab_long (sblock->fs_ntrak);
+ sblock->fs_nsect = swab_long (sblock->fs_nsect);
+ sblock->fs_spc = swab_long (sblock->fs_spc);
+ sblock->fs_ncyl = swab_long (sblock->fs_ncyl);
+ sblock->fs_cpg = swab_long (sblock->fs_cpg);
+ sblock->fs_ipg = swab_long (sblock->fs_ipg);
+ sblock->fs_fpg = swab_long (sblock->fs_fpg);
+ sblock->fs_cstotal.cs_ndir = swab_long (sblock->fs_cstotal.cs_ndir);
+ sblock->fs_cstotal.cs_nbfree = swab_long (sblock->fs_cstotal.cs_nbfree);
+ sblock->fs_cstotal.cs_nifree = swab_long (sblock->fs_cstotal.cs_nifree);
+ sblock->fs_cstotal.cs_nffree = swab_long (sblock->fs_cstotal.cs_nffree);
+ /* fs_fmod, fs_clean, fs_ronly, fs_flags, fs_fsmnt are all char */
+ sblock->fs_cgrotor = swab_long (sblock->fs_cgrotor);
+ sblock->fs_cpc = swab_long (sblock->fs_cpc);
+ sblock->fs_contigsumsize = swab_long (sblock->fs_contigsumsize);
+ sblock->fs_maysymlinksen = swab_long (sblock->fs_maysymlinksen);
+ sblock->fs_inodefmt = swab_long (sblock->fs_inodefmt);
+ sblock->fs_maxfilesize.val[0] = swab_long (sblock->fs_maxfilesize.val[0]);
+ sblock->fs_maxfilesize.val[1] = swab_long (sblock->fs_maxfilesize.val[1]);
+ sblock->fs_qbmask.val[0] = swab_long (sblock->fs_qbmask.val[0]);
+ sblock->fs_qbmask.val[1] = swab_long (sblock->fs_qbmask.val[1]);
+ sblock->fs_state = swab_long (sblock->fs_state);
+ sblock->fs_postblformat = swab_long (sblock->fs_postblformat);
+ sblock->fs_nrpos = swab_long (sblock->fs_nrpos);
+ sblock->fs_postbloff = swab_long (sblock->fs_postbloff);
+ sblock->fs_rotbloff = swab_long (sblock->fs_rotbloff);
+ sblock->fs_magic = swab_long (sblock->fs_magic);
+
+ /* Tables */
+ if (sblock->fs_postblformat == FS_42POSTBLFMT)
+ for (i = 0; i < 16; i++)
+ for (j = 0; j < 8; j++)
+ sblock->fs_opostbl[i][j] = swab_short (sblock->fs_opostbl[i][j]);
+ else
+ for (i = 0; i < sblock->fs_cpc; i++)
+ for (j = 0; j < sblock->fs_nrpos; j++)
+ fs_postbl(sblock, j)[i]
+ = swab_short (sblock->fs_postbl (sblock, j)[i]);
+
+ /* The rot table is all chars */
+}
+
+void
+swab_csums (struct csum *csum)
+{
+ int i;
+
+ for (i = 0; i < fs_ncg; i++)
+ {
+ csum[i].cs_ndir = swab_long (csum[i].cs_ndir);
+ csum[i].cs_nbfree = swab_long (csum[i].cs_nbfree);
+ csum[i].cs_nifree = swab_long (csum[i].cs_nifree);
+ csum[i].cs_nffree = swab_long (csum[i].cs_nffree);
+ }
+}
+
+void
get_hypermetadata (void)
{
error_t err;
@@ -48,6 +148,14 @@ get_hypermetadata (void)
bcopy (disk_image + SBOFF, sblock, SBSIZE);
diskfs_end_catch_exception ();
+ if ((swab_long (sblock->fs_magic)) == FS_MAGIC)
+ {
+ swab_disk = 1;
+ swab_sblock (sblock);
+ }
+ else
+ swab_disk = 0;
+
if (sblock->fs_magic != FS_MAGIC)
{
fprintf (stderr, "Bad magic number %#lx (should be %#x)\n",
@@ -138,6 +246,9 @@ get_hypermetadata (void)
fsaddr (sblock, howmany (sblock->fs_cssize, sblock->fs_fsize)));
diskfs_end_catch_exception ();
+ if (swab_disk)
+ swab_csums (csum);
+
if ((diskfs_device_size << diskfs_log2_device_block_size)
< sblock->fs_size * sblock->fs_fsize)
{
@@ -188,6 +299,8 @@ diskfs_set_hypermetadata (int wait, int clean)
if (!err)
{
bcopy (csum, (void *) buf, sblock->fs_cssize);
+ if (swab_disk)
+ swab_csums ((struct csum *)buf);
diskfs_device_write_sync (fsbtodb (sblock, sblock->fs_csaddr),
buf, bufsize);
csum_dirty = 0;
@@ -224,7 +337,8 @@ copy_sblock ()
assert (! diskfs_readonly);
if (sblock->fs_postblformat == FS_42POSTBLFMT
- || oldformat)
+ || oldformat
+ || swab_disk)
{
char sblockcopy[SBSIZE];
struct fs *sbcopy = (struct fs *)sblockcopy;
@@ -237,6 +351,8 @@ copy_sblock ()
sbcopy->fs_qbmask = -1;
sbcopy->fs_qfmask = -1;
}
+ if (swab_disk)
+ swab_sblock (sbcopy);
bcopy (sbcopy, disk_image + SBOFF, SBSIZE);
}
else