dblist_dir.c revision 21c84b71e205b5ab13f14343da5645dcc985856d
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> 1421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <unistd.h> 1521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <stdlib.h> 1621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <string.h> 1721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <time.h> 1821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#ifdef HAVE_ERRNO_H 1921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <errno.h> 2021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#endif 2121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 2221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <linux/ext2_fs.h> 2321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 2421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include "ext2fsP.h" 2521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 2621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'ostatic int db_dir_proc(ext2_filsys fs, struct ext2_db_entry *db_info, 2721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o void *private); 2821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 2921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'oextern errcode_t 3021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ext2fs_dblist_dir_iterate(ext2_dblist dblist, 3121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o int flags, 3221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o char *block_buf, 3321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o int (*func)(ino_t dir, 3421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o int entry, 3521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o struct ext2_dir_entry *dirent, 3621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o int offset, 3721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o int blocksize, 3821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o char *buf, 3921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o void *private), 4021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o void *private) 4121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o{ 4221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o errcode_t retval; 4321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o struct dir_context ctx; 4421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 4521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o EXT2_CHECK_MAGIC(dblist, EXT2_ET_MAGIC_DBLIST); 4621c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 4721c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ctx.dir = 0; 4821c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ctx.flags = flags; 4921c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o if (block_buf) 5021c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ctx.buf = block_buf; 5121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o else { 5221c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o ctx.buf = malloc(dblist->fs->blocksize); 5321c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o if (!ctx.buf) 5421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o return ENOMEM; 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) 6421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o free(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