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);