1 /* 2 * ind_block.c --- indirect block I/O routines 3 * 4 * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 5 * 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 Library 9 * General Public License, version 2. 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 22 errcode_t ext2fs_read_ind_block(ext2_filsys fs, blk_t blk, void *buf) 23 { 24 errcode_t retval; 25 #ifdef WORDS_BIGENDIAN 26 blk_t *block_nr; 27 int i; 28 int limit = fs->blocksize >> 2; 29 #endif 30 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) 37 return retval; 38 } 39 #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); 43 #endif 44 return 0; 45 } 46 47 errcode_t ext2fs_write_ind_block(ext2_filsys fs, blk_t blk, void *buf) 48 { 49 #ifdef WORDS_BIGENDIAN 50 blk_t *block_nr; 51 int i; 52 int limit = fs->blocksize >> 2; 53 #endif 54 55 if (fs->flags & EXT2_FLAG_IMAGE_FILE) 56 return 0; 57 58 #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); 62 #endif 63 return io_channel_write_blk(fs->io, blk, 1, buf); 64 } 65 66 67