dblist_dir.c revision 543547a52a20cb7e69d74921b2f691078fd55d83
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 2221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'ostatic int db_dir_proc(ext2_filsys fs, struct ext2_db_entry *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 5521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o retval = ext2fs_dblist_iterate(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 6421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'ostatic int db_dir_proc(ext2_filsys fs, struct ext2_db_entry *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