ind_block.c revision efc6f628e15de95bcd13e4f0ee223cb42115d520
1f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com/* 2f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com * ind_block.c --- indirect block I/O routines 3f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com * 4f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 5f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com * 2001, 2002, 2003, 2004, 2005 by Theodore Ts'o. 6f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com * 7f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com * %Begin-Header% 8f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com * This file may be redistributed under the terms of the GNU Public 9f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com * License. 10f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com * %End-Header% 11f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com */ 12f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com 13f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com#include <stdio.h> 14f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com#include <string.h> 15f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com#if HAVE_UNISTD_H 16f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com#include <unistd.h> 17f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com#endif 18f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com 19f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com#include "ext2_fs.h" 20ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com#include "ext2fs.h" 21ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com 22ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.comerrcode_t ext2fs_read_ind_block(ext2_filsys fs, blk_t blk, void *buf) 23ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com{ 24ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com errcode_t retval; 25ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com#ifdef WORDS_BIGENDIAN 26ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com blk_t *block_nr; 27ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com int i; 28a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.com int limit = fs->blocksize >> 2; 29b0a327e9390da5865d4c56db5e5259adc3380d37skia.committer@gmail.com#endif 30ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com 31ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com if ((fs->flags & EXT2_FLAG_IMAGE_FILE) && 32ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com (fs->io != fs->image_io)) 33ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com memset(buf, 0, fs->blocksize); 34ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com else { 35ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com retval = io_channel_read_blk(fs->io, blk, 1, buf); 36ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com if (retval) 37ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com return retval; 38ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com } 39ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com#ifdef WORDS_BIGENDIAN 40f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com block_nr = (blk_t *) buf; 41f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com for (i = 0; i < limit; i++, block_nr++) 42f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com *block_nr = ext2fs_swab32(*block_nr); 43f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com#endif 44f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com return 0; 45ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com} 46ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com 47ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.comerrcode_t ext2fs_write_ind_block(ext2_filsys fs, blk_t blk, void *buf) 48ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com{ 49ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com#ifdef WORDS_BIGENDIAN 50ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com blk_t *block_nr; 51f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com int i; 52f8d1aee2526a384a570b082b17f3a19fe72bd15ebungeman@google.com 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