e2fsprogs/lib/e2p/iod.c

67 lines
1.4 KiB
C

/*
* iod.c - Iterate a function on each entry of a directory
*
* Copyright (C) 1993, 1994 Remy Card <card@masi.ibp.fr>
* Laboratoire MASI, Institut Blaise Pascal
* Universite Pierre et Marie Curie (Paris VI)
*
* This file can be redistributed under the terms of the GNU Library General
* Public License
*/
/*
* History:
* 93/10/30 - Creation
*/
#include "e2p.h"
int iterate_on_dir (const char * dir_name,
int (*func) (const char *, struct dirent *, void *),
void * private)
{
DIR * dir;
#if HAVE_DIRENT_NAMELEN
/* Declare DE_BUF with some extra room for the name. */
char de_buf[sizeof (struct dirent) + 32];
struct dirent *de = (struct dirent *)&de_buf;
#else
struct dirent de_buf, *de = &de_buf;
#endif
struct dirent *dep;
dir = opendir (dir_name);
if (dir == NULL)
return -1;
while ((dep = readdir (dir)))
{
#if HAVE_DIRENT_NAMELEN
/* See if there's enough room for this entry in DE, and grow if
not. */
if (de_len < dep->d_reclen)
{
de_len = dep->d_reclen + 32;
de =
(de == (struct dirent *)&de_buf
? malloc (de_len)
: realloc (de, de_len));
if (de == NULL)
{
errno = ENOMEM;
return -1;
}
}
memcpy (de, dep, dep->d_reclen);
#else
*de = *dep;
#endif
(*func) (dir_name, de, private);
}
#if HAVE_DIRENT_NAMELEN
if (de != (struct dirent *)&de_buf)
free (de);
#endif
closedir (dir);
return 0;
}