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 * 8543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %Begin-Header% 9543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * This file may be redistributed under the terms of the GNU Library 10543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * General Public License, version 2. 11543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %End-Header% 123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * History: 163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 93/10/30 - Creation 173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "e2p.h" 20593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#if HAVE_UNISTD_H 21593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#include <unistd.h> 22593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#endif 23520ead378ec5ddef828a8d206434cc3a444b2e9eTheodore Ts'o#include <stdlib.h> 2448e6e81362f264aee4f3945c14928efaf71a06c9Theodore Ts'o#include <string.h> 253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint iterate_on_dir (const char * dir_name, 273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o int (*func) (const char *, struct dirent *, void *), 283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o void * private) 293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o DIR * dir; 31593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o struct dirent *de, *dep; 3214bd240b4607971151611626ec83dc821f92be5fTheodore Ts'o int max_len = -1, len, ret = 0; 33593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o 34efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o#if HAVE_PATHCONF && defined(_PC_NAME_MAX) 35593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o max_len = pathconf(dir_name, _PC_NAME_MAX); 3650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif 37593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o if (max_len == -1) { 38593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#ifdef _POSIX_NAME_MAX 39593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o max_len = _POSIX_NAME_MAX; 40593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#else 41593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#ifdef NAME_MAX 42593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o max_len = NAME_MAX; 43593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#else 44593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o max_len = 256; 45593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#endif /* NAME_MAX */ 46593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#endif /* _POSIX_NAME_MAX */ 47593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o } 48593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o max_len += sizeof(struct dirent); 49593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o 50593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o de = malloc(max_len+1); 51593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o if (!de) 52593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o return -1; 53593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o memset(de, 0, max_len+1); 543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o dir = opendir (dir_name); 56593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o if (dir == NULL) { 57593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o free(de); 583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return -1; 593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 60593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o while ((dep = readdir (dir))) { 61fff45483ede7fe38a31b3364a9c07e2418776deeTheodore Ts'o#ifdef HAVE_RECLEN_DIRENT 627fd2651f67a43fad3cc1cc2db7c0e5f9c568023cTheodore Ts'o len = dep->d_reclen; 63593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o if (len > max_len) 64593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o len = max_len; 657fd2651f67a43fad3cc1cc2db7c0e5f9c568023cTheodore Ts'o#else 667fd2651f67a43fad3cc1cc2db7c0e5f9c568023cTheodore Ts'o len = sizeof(struct dirent); 67fff45483ede7fe38a31b3364a9c07e2418776deeTheodore Ts'o#endif 68593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o memcpy(de, dep, len); 6914bd240b4607971151611626ec83dc821f92be5fTheodore Ts'o if ((*func)(dir_name, de, private)) 7014bd240b4607971151611626ec83dc821f92be5fTheodore Ts'o ret++; 71593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o } 72593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o free(de); 73593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o closedir(dir); 7414bd240b4607971151611626ec83dc821f92be5fTheodore Ts'o return ret; 753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 76