dblist_dir.c revision 7b4e4534f9361b21d3fafdd88a58f133decee38c
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 521c84b71e205b5ab13f14343da5645dcc985856dTheodore 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% 1021c84b71e205b5ab13f14343da5645dcc985856dTheodore 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 <stdlib.h> 1821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <string.h> 1921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <time.h> 2021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 2121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <linux/ext2_fs.h> 2221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 2321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include "ext2fsP.h" 2421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 2521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'ostatic int db_dir_proc(ext2_filsys fs, struct ext2_db_entry *db_info, 2621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o void *private); 2721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 2821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern errcode_t 2921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ext2fs_dblist_dir_iterate(ext2_dblist dblist, 3021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o int flags, 3121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o char *block_buf, 3221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o int (*func)(ino_t dir, 3321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o int entry, 3421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o struct ext2_dir_entry *dirent, 3521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o int offset, 3621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o int blocksize, 3721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o char *buf, 3821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o void *private), 3921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o void *private) 4021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{ 4121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o errcode_t retval; 4221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o struct dir_context ctx; 4321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 4421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o EXT2_CHECK_MAGIC(dblist, EXT2_ET_MAGIC_DBLIST); 4521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 4621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ctx.dir = 0; 4721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ctx.flags = flags; 4821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o if (block_buf) 4921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ctx.buf = block_buf; 5021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o else { 517b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o retval = ext2fs_get_mem(dblist->fs->blocksize, 527b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o (void **) &ctx.buf); 537b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o if (retval) 547b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o return retval; 5521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o } 5621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ctx.func = 0; 5721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ctx.func2 = func; 5821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ctx.private = private; 5921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ctx.errcode = 0; 6021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 6121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o retval = ext2fs_dblist_iterate(dblist, db_dir_proc, &ctx); 6221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 6321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o if (!block_buf) 647b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o ext2fs_free_mem((void **) &ctx.buf); 6521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o if (retval) 6621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o return retval; 6721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o return ctx.errcode; 6821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o} 6921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 7021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'ostatic int db_dir_proc(ext2_filsys fs, struct ext2_db_entry *db_info, 7121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o void *private) 7221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{ 7321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o struct dir_context *ctx = private; 7421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 7521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ctx->dir = db_info->ino; 7621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 7721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o return ext2fs_process_dir_block(fs, &db_info->blk, 7821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o db_info->blockcnt, private); 7921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o} 80