119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * dblist_dir.c --- iterate by directory entry 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright 1997 by Theodore Ts'o 53984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %Begin-Header% 78558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * This file may be redistributed under the terms of the GNU Library 88558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * General Public License, version 2. 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %End-Header% 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h> 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_UNISTD_H 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h> 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <time.h> 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2_fs.h" 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2fsP.h" 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int db_dir_proc(ext2_filsys fs, struct ext2_db_entry *db_info, 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void *priv_data); 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_dblist_dir_iterate(ext2_dblist dblist, 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int flags, 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *block_buf, 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int (*func)(ext2_ino_t dir, 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int entry, 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_dir_entry *dirent, 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int offset, 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int blocksize, 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *buf, 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void *priv_data), 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void *priv_data) 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct dir_context ctx; 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_CHECK_MAGIC(dblist, EXT2_ET_MAGIC_DBLIST); 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ctx.dir = 0; 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ctx.flags = flags; 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (block_buf) 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ctx.buf = block_buf; 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else { 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_mem(dblist->fs->blocksize, &ctx.buf); 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ctx.func = func; 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ctx.priv_data = priv_data; 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ctx.errcode = 0; 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_dblist_iterate(dblist, db_dir_proc, &ctx); 563984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!block_buf) 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_free_mem(&ctx.buf); 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return ctx.errcode; 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int db_dir_proc(ext2_filsys fs, struct ext2_db_entry *db_info, 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void *priv_data) 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct dir_context *ctx; 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int ret; 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ctx = (struct dir_context *) priv_data; 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ctx->dir = db_info->ino; 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ctx->errcode = 0; 733984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ret = ext2fs_process_dir_block(fs, &db_info->blk, 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project db_info->blockcnt, 0, 0, priv_data); 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((ret & BLOCK_ABORT) && !ctx->errcode) 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return DBLIST_ABORT; 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 80