]>
git.ipfire.org Git - thirdparty/e2fsprogs.git/blob - lib/ext2fs/dirblock.c
2 * dirblock.c --- directory block routines.
4 * Copyright (C) 1995, 1996 Theodore Ts'o.
7 * This file may be redistributed under the terms of the GNU Public
22 errcode_t
ext2fs_read_dir_block2(ext2_filsys fs
, blk_t block
,
23 void *buf
, int flags
EXT2FS_ATTR((unused
)))
27 struct ext2_dir_entry
*dirent
;
28 unsigned int name_len
, rec_len
;
31 retval
= io_channel_read_blk(fs
->io
, block
, 1, buf
);
36 end
= (char *) buf
+ fs
->blocksize
;
38 dirent
= (struct ext2_dir_entry
*) p
;
39 #ifdef WORDS_BIGENDIAN
40 dirent
->inode
= ext2fs_swab32(dirent
->inode
);
41 dirent
->rec_len
= ext2fs_swab16(dirent
->rec_len
);
42 dirent
->name_len
= ext2fs_swab16(dirent
->name_len
);
44 name_len
= dirent
->name_len
;
45 #ifdef WORDS_BIGENDIAN
46 if (flags
& EXT2_DIRBLOCK_V2_STRUCT
)
47 dirent
->name_len
= ext2fs_swab16(dirent
->name_len
);
49 rec_len
= (dirent
->rec_len
|| fs
->blocksize
< 65536) ?
50 dirent
->rec_len
: 65536;
51 if ((rec_len
< 8) || (rec_len
% 4)) {
53 retval
= EXT2_ET_DIR_CORRUPTED
;
54 } else if (((name_len
& 0xFF) + 8) > rec_len
)
55 retval
= EXT2_ET_DIR_CORRUPTED
;
61 errcode_t
ext2fs_read_dir_block(ext2_filsys fs
, blk_t block
,
64 return ext2fs_read_dir_block2(fs
, block
, buf
, 0);
68 errcode_t
ext2fs_write_dir_block2(ext2_filsys fs
, blk_t block
,
69 void *inbuf
, int flags
EXT2FS_ATTR((unused
)))
71 #ifdef WORDS_BIGENDIAN
76 struct ext2_dir_entry
*dirent
;
78 retval
= ext2fs_get_mem(fs
->blocksize
, &buf
);
81 memcpy(buf
, inbuf
, fs
->blocksize
);
83 end
= buf
+ fs
->blocksize
;
85 dirent
= (struct ext2_dir_entry
*) p
;
86 rec_len
= (dirent
->rec_len
|| fs
->blocksize
< 65536) ?
87 dirent
->rec_len
: 65536;
90 ext2fs_free_mem(&buf
);
91 return (EXT2_ET_DIR_CORRUPTED
);
94 dirent
->inode
= ext2fs_swab32(dirent
->inode
);
95 dirent
->rec_len
= ext2fs_swab16(dirent
->rec_len
);
96 dirent
->name_len
= ext2fs_swab16(dirent
->name_len
);
98 if (flags
& EXT2_DIRBLOCK_V2_STRUCT
)
99 dirent
->name_len
= ext2fs_swab16(dirent
->name_len
);
101 retval
= io_channel_write_blk(fs
->io
, block
, 1, buf
);
102 ext2fs_free_mem(&buf
);
105 return io_channel_write_blk(fs
->io
, block
, 1, (char *) inbuf
);
110 errcode_t
ext2fs_write_dir_block(ext2_filsys fs
, blk_t block
,
113 return ext2fs_write_dir_block2(fs
, block
, inbuf
, 0);