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