iod.c revision 50e1e10fa0ac12a3e2a9d20a75ee9041873cda96
13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * iod.c - Iterate a function on each entry of a directory 33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 43839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Copyright (C) 1993, 1994 Remy Card <card@masi.ibp.fr> 53839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Laboratoire MASI, Institut Blaise Pascal 63839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Universite Pierre et Marie Curie (Paris VI) 73839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 83839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * This file can be redistributed under the terms of the GNU Library General 93839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Public License 103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * History: 143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 93/10/30 - Creation 153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "e2p.h" 183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint iterate_on_dir (const char * dir_name, 203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o int (*func) (const char *, struct dirent *, void *), 213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o void * private) 223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o DIR * dir; 2450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_DIRENT_NAMELEN 2550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o /* Declare DE_BUF with some extra room for the name. */ 2650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o char de_buf[sizeof (struct dirent) + 32]; 2750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o struct dirent *de = (struct dirent *)&de_buf; 2850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#else 2950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o struct dirent de_buf, *de = &de_buf; 3050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif 313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o struct dirent *dep; 323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o dir = opendir (dir_name); 343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (dir == NULL) 353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return -1; 363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o while ((dep = readdir (dir))) 373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o { 3850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_DIRENT_NAMELEN 3950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o /* See if there's enough room for this entry in DE, and grow if 4050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o not. */ 4150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o if (de_len < dep->d_reclen) 4250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o { 4350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o de_len = dep->d_reclen + 32; 4450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o de = 4550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o (de == (struct dirent *)&de_buf 4650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o ? malloc (de_len) 4750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o : realloc (de, de_len)); 4850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o if (de == NULL) 4950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o { 5050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o errno = ENOMEM; 5150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o return -1; 5250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o } 5350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o } 5450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o memcpy (de, dep, dep->d_reclen); 5550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#else 5650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o *de = *dep; 5750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif 5850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o (*func) (dir_name, de, private); 593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 6050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#if HAVE_DIRENT_NAMELEN 6150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o if (de != (struct dirent *)&de_buf) 6250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o free (de); 6350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif 643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o closedir (dir); 653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return 0; 663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 67