blob: 09c04324553ff604c3f1d184ad754e2cd271cd3f [file] [log] [blame]
Theodore Ts'odc8ce342005-01-06 00:04:24 -05001/*
2 * ind_block.c --- indirect block I/O routines
Theodore Ts'oefc6f622008-08-27 23:07:54 -04003 *
4 * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
Theodore Ts'odc8ce342005-01-06 00:04:24 -05005 * 2001, 2002, 2003, 2004, 2005 by Theodore Ts'o.
6 *
7 * %Begin-Header%
8 * This file may be redistributed under the terms of the GNU Public
9 * License.
10 * %End-Header%
11 */
12
13#include <stdio.h>
14#include <string.h>
15#if HAVE_UNISTD_H
16#include <unistd.h>
17#endif
18
19#include "ext2_fs.h"
20#include "ext2fs.h"
21
22errcode_t ext2fs_read_ind_block(ext2_filsys fs, blk_t blk, void *buf)
23{
24 errcode_t retval;
Theodore Ts'o2d328bb2008-03-17 23:17:13 -040025#ifdef WORDS_BIGENDIAN
Theodore Ts'odc8ce342005-01-06 00:04:24 -050026 blk_t *block_nr;
27 int i;
28 int limit = fs->blocksize >> 2;
Theodore Ts'o2d328bb2008-03-17 23:17:13 -040029#endif
Theodore Ts'odc8ce342005-01-06 00:04:24 -050030
31 if ((fs->flags & EXT2_FLAG_IMAGE_FILE) &&
32 (fs->io != fs->image_io))
33 memset(buf, 0, fs->blocksize);
34 else {
35 retval = io_channel_read_blk(fs->io, blk, 1, buf);
36 if (retval)
Theodore Ts'ob1ae1192005-04-09 01:21:21 -040037 return retval;
Theodore Ts'odc8ce342005-01-06 00:04:24 -050038 }
Theodore Ts'o126a2912007-08-11 01:56:48 -040039#ifdef WORDS_BIGENDIAN
40 block_nr = (blk_t *) buf;
41 for (i = 0; i < limit; i++, block_nr++)
42 *block_nr = ext2fs_swab32(*block_nr);
Theodore Ts'odc8ce342005-01-06 00:04:24 -050043#endif
44 return 0;
45}
46
47errcode_t ext2fs_write_ind_block(ext2_filsys fs, blk_t blk, void *buf)
48{
Theodore Ts'o2d328bb2008-03-17 23:17:13 -040049#ifdef WORDS_BIGENDIAN
Theodore Ts'odc8ce342005-01-06 00:04:24 -050050 blk_t *block_nr;
51 int i;
52 int limit = fs->blocksize >> 2;
Theodore Ts'o2d328bb2008-03-17 23:17:13 -040053#endif
Theodore Ts'odc8ce342005-01-06 00:04:24 -050054
55 if (fs->flags & EXT2_FLAG_IMAGE_FILE)
56 return 0;
57
Theodore Ts'o126a2912007-08-11 01:56:48 -040058#ifdef WORDS_BIGENDIAN
59 block_nr = (blk_t *) buf;
60 for (i = 0; i < limit; i++, block_nr++)
61 *block_nr = ext2fs_swab32(*block_nr);
Theodore Ts'odc8ce342005-01-06 00:04:24 -050062#endif
63 return io_channel_write_blk(fs->io, blk, 1, buf);
64}
65
66