dblist_dir.c revision efc6f628e15de95bcd13e4f0ee223cb42115d520
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% 721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * This file may be redistributed under the terms of the GNU Public 821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * License. 921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o * %End-Header% 10efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 1121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o */ 1221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 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 2321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'ostatic int db_dir_proc(ext2_filsys fs, struct ext2_db_entry *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 5621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o retval = ext2fs_dblist_iterate(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 6521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'ostatic int db_dir_proc(ext2_filsys fs, struct ext2_db_entry *db_info, 66b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o void *priv_data) 6721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{ 68b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o struct dir_context *ctx; 69f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o int ret; 7021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 71b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o ctx = (struct dir_context *) priv_data; 7221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ctx->dir = db_info->ino; 73f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o ctx->errcode = 0; 74efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 75f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o ret = ext2fs_process_dir_block(fs, &db_info->blk, 76f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o db_info->blockcnt, 0, 0, priv_data); 77f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o if ((ret & BLOCK_ABORT) && !ctx->errcode) 78f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o return DBLIST_ABORT; 79f6341e9c70eb4e0ded51ca96aeaa79a72222c069Theodore Ts'o return 0; 8021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o} 81