121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o/*
221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * dblist_dir.c --- iterate by directory entry
321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o *
421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * Copyright 1997 by Theodore Ts'o
5efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *
621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * %Begin-Header%
7543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * This file may be redistributed under the terms of the GNU Library
8543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * General Public License, version 2.
921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * %End-Header%
1021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o */
1121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
12d1154eb460efe588eaed3d439c1caaca149fa362Theodore Ts'o#include "config.h"
1321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <stdio.h>
144cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3Theodore Ts'o#if HAVE_UNISTD_H
1521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <unistd.h>
164cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3Theodore Ts'o#endif
1721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <string.h>
1821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <time.h>
1921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
20b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o#include "ext2_fs.h"
2121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include "ext2fsP.h"
2221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
23ab13b5a9795a8c20f1d6da8fe1da340f545ec0e0Theodore Ts'ostatic int db_dir_proc(ext2_filsys fs, struct ext2_db_entry2 *db_info,
24b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o		       void *priv_data);
2521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
262eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'oerrcode_t ext2fs_dblist_dir_iterate(ext2_dblist dblist,
272eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o				    int	flags,
282eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o				    char	*block_buf,
2931dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				    int (*func)(ext2_ino_t dir,
302eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o						int	entry,
312eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o						struct ext2_dir_entry *dirent,
322eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o						int	offset,
332eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o						int	blocksize,
342eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o						char	*buf,
352eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o						void	*priv_data),
362eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o				    void *priv_data)
3721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{
3821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	errcode_t		retval;
3921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	struct dir_context	ctx;
4021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
4121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	EXT2_CHECK_MAGIC(dblist, EXT2_ET_MAGIC_DBLIST);
4221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
4321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	ctx.dir = 0;
4421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	ctx.flags = flags;
4521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	if (block_buf)
4621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		ctx.buf = block_buf;
4721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	else {
48c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o		retval = ext2fs_get_mem(dblist->fs->blocksize, &ctx.buf);
497b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o		if (retval)
507b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o			return retval;
5121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	}
528bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	ctx.func = func;
53b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o	ctx.priv_data = priv_data;
5421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	ctx.errcode = 0;
5521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
56ab13b5a9795a8c20f1d6da8fe1da340f545ec0e0Theodore Ts'o	retval = ext2fs_dblist_iterate2(dblist, db_dir_proc, &ctx);
57efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
5821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	if (!block_buf)
59c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o		ext2fs_free_mem(&ctx.buf);
6021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	if (retval)
6121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		return retval;
6221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	return ctx.errcode;
6321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o}
6421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
65ab13b5a9795a8c20f1d6da8fe1da340f545ec0e0Theodore Ts'ostatic int db_dir_proc(ext2_filsys fs, struct ext2_db_entry2 *db_info,
66b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o		       void *priv_data)
6721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{
68042e0719e29ddfb64a76213304403a46a05c38bfZheng Liu	struct ext2_inode	inode;
69b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o	struct dir_context	*ctx;
70f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o	int			ret;
7121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
72b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o	ctx = (struct dir_context *) priv_data;
7321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	ctx->dir = db_info->ino;
74f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o	ctx->errcode = 0;
75efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
76042e0719e29ddfb64a76213304403a46a05c38bfZheng Liu	ctx->errcode = ext2fs_read_inode(fs, ctx->dir, &inode);
77042e0719e29ddfb64a76213304403a46a05c38bfZheng Liu	if (ctx->errcode)
78042e0719e29ddfb64a76213304403a46a05c38bfZheng Liu		return DBLIST_ABORT;
798f22fa055bdf9dbe0dc8a5de440ed57eb706e098Darrick J. Wong	if (inode.i_flags & EXT4_INLINE_DATA_FL)
80042e0719e29ddfb64a76213304403a46a05c38bfZheng Liu		ret = ext2fs_inline_data_dir_iterate(fs, ctx->dir, ctx);
818f22fa055bdf9dbe0dc8a5de440ed57eb706e098Darrick J. Wong	else
82042e0719e29ddfb64a76213304403a46a05c38bfZheng Liu		ret = ext2fs_process_dir_block(fs, &db_info->blk,
83042e0719e29ddfb64a76213304403a46a05c38bfZheng Liu					       db_info->blockcnt, 0, 0,
84042e0719e29ddfb64a76213304403a46a05c38bfZheng Liu					       priv_data);
85f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o	if ((ret & BLOCK_ABORT) && !ctx->errcode)
86f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o		return DBLIST_ABORT;
87f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o	return 0;
8821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o}
89