Home | History | Annotate | Download | only in ext2fs
      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