1 /* 2 * dirblock.c --- directory block routines. 3 * 4 * Copyright (C) 1995, 1996 Theodore Ts'o. 5 * 6 * %Begin-Header% 7 * This file may be redistributed under the terms of the GNU Library 8 * General Public License, version 2. 9 * %End-Header% 10 */ 11 12 #include "config.h" 13 #include <stdio.h> 14 #if HAVE_UNISTD_H 15 #include <unistd.h> 16 #endif 17 #include <string.h> 18 #include <time.h> 19 20 #include "ext2_fs.h" 21 #include "ext2fs.h" 22 23 errcode_t ext2fs_read_dir_block4(ext2_filsys fs, blk64_t block, 24 void *buf, int flags EXT2FS_ATTR((unused)), 25 ext2_ino_t ino) 26 { 27 errcode_t retval; 28 int corrupt = 0; 29 30 retval = io_channel_read_blk64(fs->io, block, 1, buf); 31 if (retval) 32 return retval; 33 34 if (!(fs->flags & EXT2_FLAG_IGNORE_CSUM_ERRORS) && 35 !ext2fs_dir_block_csum_verify(fs, ino, 36 (struct ext2_dir_entry *)buf)) 37 corrupt = 1; 38 39 #ifdef WORDS_BIGENDIAN 40 retval = ext2fs_dirent_swab_in(fs, buf, flags); 41 #endif 42 if (!retval && corrupt) 43 retval = EXT2_ET_DIR_CSUM_INVALID; 44 return retval; 45 } 46 47 errcode_t ext2fs_read_dir_block3(ext2_filsys fs, blk64_t block, 48 void *buf, int flags EXT2FS_ATTR((unused))) 49 { 50 return ext2fs_read_dir_block4(fs, block, buf, flags, 0); 51 } 52 53 errcode_t ext2fs_read_dir_block2(ext2_filsys fs, blk_t block, 54 void *buf, int flags EXT2FS_ATTR((unused))) 55 { 56 return ext2fs_read_dir_block3(fs, block, buf, flags); 57 } 58 59 errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block, 60 void *buf) 61 { 62 return ext2fs_read_dir_block3(fs, block, buf, 0); 63 } 64 65 66 errcode_t ext2fs_write_dir_block4(ext2_filsys fs, blk64_t block, 67 void *inbuf, int flags EXT2FS_ATTR((unused)), 68 ext2_ino_t ino) 69 { 70 errcode_t retval; 71 char *buf = inbuf; 72 73 #ifdef WORDS_BIGENDIAN 74 retval = ext2fs_get_mem(fs->blocksize, &buf); 75 if (retval) 76 return retval; 77 memcpy(buf, inbuf, fs->blocksize); 78 retval = ext2fs_dirent_swab_out(fs, buf, flags); 79 if (retval) 80 return retval; 81 #endif 82 retval = ext2fs_dir_block_csum_set(fs, ino, 83 (struct ext2_dir_entry *)buf); 84 if (retval) 85 goto out; 86 87 retval = io_channel_write_blk64(fs->io, block, 1, buf); 88 89 out: 90 #ifdef WORDS_BIGENDIAN 91 ext2fs_free_mem(&buf); 92 #endif 93 return retval; 94 } 95 96 errcode_t ext2fs_write_dir_block3(ext2_filsys fs, blk64_t block, 97 void *inbuf, int flags EXT2FS_ATTR((unused))) 98 { 99 return ext2fs_write_dir_block4(fs, block, inbuf, flags, 0); 100 } 101 102 errcode_t ext2fs_write_dir_block2(ext2_filsys fs, blk_t block, 103 void *inbuf, int flags EXT2FS_ATTR((unused))) 104 { 105 return ext2fs_write_dir_block3(fs, block, inbuf, flags); 106 } 107 108 errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block, 109 void *inbuf) 110 { 111 return ext2fs_write_dir_block3(fs, block, inbuf, 0); 112 } 113 114