summaryrefslogtreecommitdiff
path: root/lib/ext2fs/dirblock.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ext2fs/dirblock.c')
-rw-r--r--lib/ext2fs/dirblock.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/lib/ext2fs/dirblock.c b/lib/ext2fs/dirblock.c
new file mode 100644
index 00000000..bb2f7175
--- /dev/null
+++ b/lib/ext2fs/dirblock.c
@@ -0,0 +1,74 @@
+/*
+ * dirblock.c --- directory block routines.
+ *
+ * Copyright (C) 1995 Theodore Ts'o. This file may be redistributed
+ * under the terms of the GNU Public License.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <time.h>
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#include <linux/ext2_fs.h>
+
+#include "ext2fs.h"
+
+errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block,
+ void *buf)
+{
+ errcode_t retval;
+ char *p, *end;
+ struct ext2_dir_entry *dirent;
+
+ retval = io_channel_read_blk(fs->io, block, 1, buf);
+ if (retval)
+ return retval;
+ if ((fs->flags & EXT2_SWAP_BYTES) == 0)
+ return 0;
+ p = buf;
+ end = (char *) buf + fs->blocksize;
+ while (p < end) {
+ dirent = (struct ext2_dir_entry *) p;
+ dirent->inode = ext2fs_swab32(dirent->inode);
+ dirent->rec_len = ext2fs_swab16(dirent->rec_len);
+ dirent->name_len = ext2fs_swab16(dirent->name_len);
+ p += (dirent->rec_len < 8) ? 8 : dirent->rec_len;
+ }
+ return 0;
+}
+
+errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block,
+ void *inbuf)
+{
+ errcode_t retval;
+ char *p, *end, *write_buf;
+ char *buf = 0;
+ struct ext2_dir_entry *dirent;
+
+ if (fs->flags & EXT2_SWAP_BYTES) {
+ write_buf = buf = malloc(fs->blocksize);
+ if (!buf)
+ return ENOMEM;
+ memcpy(buf, inbuf, fs->blocksize);
+ p = buf;
+ end = buf + fs->blocksize;
+ while (p < end) {
+ dirent = (struct ext2_dir_entry *) p;
+ p += (dirent->rec_len < 8) ? 8 : dirent->rec_len;
+ dirent->inode = ext2fs_swab32(dirent->inode);
+ dirent->rec_len = ext2fs_swab16(dirent->rec_len);
+ dirent->name_len = ext2fs_swab16(dirent->name_len);
+ }
+ } else
+ write_buf = inbuf;
+ retval = io_channel_write_blk(fs->io, block, 1, write_buf);
+ if (buf)
+ free(buf);
+ return retval;
+}
+
+