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
1221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <stdio.h>
134cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3Theodore Ts'o#if HAVE_UNISTD_H
1421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <unistd.h>
154cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3Theodore Ts'o#endif
1621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <string.h>
1721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <time.h>
1821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
19b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o#include "ext2_fs.h"
2021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include "ext2fsP.h"
2121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
22e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int db_dir_proc(ext2_filsys fs, struct ext2_db_entry2 *db_info,
23b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o		       void *priv_data);
2421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
252eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'oerrcode_t ext2fs_dblist_dir_iterate(ext2_dblist dblist,
262eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o				    int	flags,
272eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o				    char	*block_buf,
2831dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				    int (*func)(ext2_ino_t dir,
292eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o						int	entry,
302eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o						struct ext2_dir_entry *dirent,
312eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o						int	offset,
322eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o						int	blocksize,
332eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o						char	*buf,
342eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o						void	*priv_data),
352eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o				    void *priv_data)
3621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{
3721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	errcode_t		retval;
3821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	struct dir_context	ctx;
3921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
4021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	EXT2_CHECK_MAGIC(dblist, EXT2_ET_MAGIC_DBLIST);
4121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
4221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	ctx.dir = 0;
4321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	ctx.flags = flags;
4421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	if (block_buf)
4521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		ctx.buf = block_buf;
4621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	else {
47c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o		retval = ext2fs_get_mem(dblist->fs->blocksize, &ctx.buf);
487b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o		if (retval)
497b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o			return retval;
5021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	}
518bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o	ctx.func = func;
52b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o	ctx.priv_data = priv_data;
5321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	ctx.errcode = 0;
5421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
55e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	retval = ext2fs_dblist_iterate2(dblist, db_dir_proc, &ctx);
56efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
5721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	if (!block_buf)
58c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o		ext2fs_free_mem(&ctx.buf);
5921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	if (retval)
6021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o		return retval;
6121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	return ctx.errcode;
6221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o}
6321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
64e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int db_dir_proc(ext2_filsys fs, struct ext2_db_entry2 *db_info,
65b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o		       void *priv_data)
6621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{
67b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o	struct dir_context	*ctx;
68f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o	int			ret;
6921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o
70b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o	ctx = (struct dir_context *) priv_data;
7121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o	ctx->dir = db_info->ino;
72f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o	ctx->errcode = 0;
73efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
74f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o	ret = ext2fs_process_dir_block(fs, &db_info->blk,
75f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o				       db_info->blockcnt, 0, 0, priv_data);
76f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o	if ((ret & BLOCK_ABORT) && !ctx->errcode)
77f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o		return DBLIST_ABORT;
78f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o	return 0;
7921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o}
80