dblist_dir.c revision 31dbecd482405e0d3a67eb58e1a1c8cb9f2ad83e
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * dblist_dir.c --- iterate by directory entry 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 1997 by Theodore Ts'o 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * %Begin-Header% 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file may be redistributed under the terms of the GNU Public 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * License. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * %End-Header% 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <stdio.h> 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if HAVE_UNISTD_H 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <unistd.h> 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string.h> 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <time.h> 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if EXT2_FLAT_INCLUDES 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ext2_fs.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <linux/ext2_fs.h> 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ext2fsP.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int db_dir_proc(ext2_filsys fs, struct ext2_db_entry *db_info, 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void *priv_data); 30c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 31c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdocherrcode_t ext2fs_dblist_dir_iterate(ext2_dblist dblist, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *block_buf, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int (*func)(ext2_ino_t dir, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int entry, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ext2_dir_entry *dirent, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int offset, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int blocksize, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *buf, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *priv_data), 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *priv_data) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errcode_t retval; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct dir_context ctx; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXT2_CHECK_MAGIC(dblist, EXT2_ET_MAGIC_DBLIST); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ctx.dir = 0; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctx.flags = flags; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (block_buf) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctx.buf = block_buf; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval = ext2fs_get_mem(dblist->fs->blocksize, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void **) &ctx.buf); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (retval) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return retval; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctx.func = 0; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctx.func2 = func; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctx.priv_data = priv_data; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ctx.errcode = 0; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval = ext2fs_dblist_iterate(dblist, db_dir_proc, &ctx); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!block_buf) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2fs_free_mem((void **) &ctx.buf); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (retval) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return retval; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ctx.errcode; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int db_dir_proc(ext2_filsys fs, struct ext2_db_entry *db_info, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void *priv_data) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct dir_context *ctx; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctx = (struct dir_context *) priv_data; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctx->dir = db_info->ino; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ext2fs_process_dir_block(fs, &db_info->blk, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_info->blockcnt, 0, 0, priv_data); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)