1 /* vi: set sw=4 ts=4: */
3 * dirblock.c --- directory block routines.
5 * Copyright (C) 1995, 1996 Theodore Ts'o.
8 * This file may be redistributed under the terms of the GNU Public
23 errcode_t
ext2fs_read_dir_block2(ext2_filsys fs
, blk_t block
,
24 void *buf
, int flags
EXT2FS_ATTR((unused
)))
28 struct ext2_dir_entry
*dirent
;
29 unsigned int name_len
, rec_len
;
34 retval
= io_channel_read_blk(fs
->io
, block
, 1, buf
);
38 do_swap
= (fs
->flags
& (EXT2_FLAG_SWAP_BYTES
|
39 EXT2_FLAG_SWAP_BYTES_READ
)) != 0;
42 end
= (char *) buf
+ fs
->blocksize
;
44 dirent
= (struct ext2_dir_entry
*) p
;
47 dirent
->inode
= ext2fs_swab32(dirent
->inode
);
48 dirent
->rec_len
= ext2fs_swab16(dirent
->rec_len
);
49 dirent
->name_len
= ext2fs_swab16(dirent
->name_len
);
52 name_len
= dirent
->name_len
;
53 #ifdef WORDS_BIGENDIAN
54 if (flags
& EXT2_DIRBLOCK_V2_STRUCT
)
55 dirent
->name_len
= ext2fs_swab16(dirent
->name_len
);
57 rec_len
= dirent
->rec_len
;
58 if ((rec_len
< 8) || (rec_len
% 4)) {
60 retval
= EXT2_ET_DIR_CORRUPTED
;
62 if (((name_len
& 0xFF) + 8) > dirent
->rec_len
)
63 retval
= EXT2_ET_DIR_CORRUPTED
;
69 errcode_t
ext2fs_read_dir_block(ext2_filsys fs
, blk_t block
,
72 return ext2fs_read_dir_block2(fs
, block
, buf
, 0);
76 errcode_t
ext2fs_write_dir_block2(ext2_filsys fs
, blk_t block
,
77 void *inbuf
, int flags
EXT2FS_ATTR((unused
)))
84 struct ext2_dir_entry
*dirent
;
86 if ((fs
->flags
& EXT2_FLAG_SWAP_BYTES
) ||
87 (fs
->flags
& EXT2_FLAG_SWAP_BYTES_WRITE
))
90 #ifndef WORDS_BIGENDIAN
92 return io_channel_write_blk(fs
->io
, block
, 1, (char *) inbuf
);
95 retval
= ext2fs_get_mem(fs
->blocksize
, &buf
);
98 memcpy(buf
, inbuf
, fs
->blocksize
);
100 end
= buf
+ fs
->blocksize
;
102 dirent
= (struct ext2_dir_entry
*) p
;
103 if ((dirent
->rec_len
< 8) ||
104 (dirent
->rec_len
% 4)) {
105 ext2fs_free_mem(&buf
);
106 return EXT2_ET_DIR_CORRUPTED
;
108 p
+= dirent
->rec_len
;
110 dirent
->inode
= ext2fs_swab32(dirent
->inode
);
111 dirent
->rec_len
= ext2fs_swab16(dirent
->rec_len
);
112 dirent
->name_len
= ext2fs_swab16(dirent
->name_len
);
114 #ifdef WORDS_BIGENDIAN
115 if (flags
& EXT2_DIRBLOCK_V2_STRUCT
)
116 dirent
->name_len
= ext2fs_swab16(dirent
->name_len
);
119 retval
= io_channel_write_blk(fs
->io
, block
, 1, buf
);
120 ext2fs_free_mem(&buf
);
123 return io_channel_write_blk(fs
->io
, block
, 1, (char *) inbuf
);
128 errcode_t
ext2fs_write_dir_block(ext2_filsys fs
, blk_t block
,
131 return ext2fs_write_dir_block2(fs
, block
, inbuf
, 0);