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