iod.c revision efc6f628e15de95bcd13e4f0ee223cb42115d520
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" 18593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#if HAVE_UNISTD_H 19593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#include <unistd.h> 20593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#endif 21520ead378ec5ddef828a8d206434cc3a444b2e9eTheodore Ts'o#include <stdlib.h> 2248e6e81362f264aee4f3945c14928efaf71a06c9Theodore Ts'o#include <string.h> 233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint iterate_on_dir (const char * dir_name, 253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o int (*func) (const char *, struct dirent *, void *), 263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o void * private) 273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o DIR * dir; 29593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o struct dirent *de, *dep; 3014bd240b4607971151611626ec83dc821f92be5fTheodore Ts'o int max_len = -1, len, ret = 0; 31593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o 32efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o#if HAVE_PATHCONF && defined(_PC_NAME_MAX) 33593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o max_len = pathconf(dir_name, _PC_NAME_MAX); 3450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#endif 35593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o if (max_len == -1) { 36593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#ifdef _POSIX_NAME_MAX 37593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o max_len = _POSIX_NAME_MAX; 38593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#else 39593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#ifdef NAME_MAX 40593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o max_len = NAME_MAX; 41593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#else 42593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o max_len = 256; 43593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#endif /* NAME_MAX */ 44593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o#endif /* _POSIX_NAME_MAX */ 45593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o } 46593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o max_len += sizeof(struct dirent); 47593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o 48593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o de = malloc(max_len+1); 49593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o if (!de) 50593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o return -1; 51593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o memset(de, 0, max_len+1); 523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o dir = opendir (dir_name); 54593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o if (dir == NULL) { 55593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o free(de); 563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return -1; 573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 58593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o while ((dep = readdir (dir))) { 59fff45483ede7fe38a31b3364a9c07e2418776deeTheodore Ts'o len = sizeof(struct dirent); 60fff45483ede7fe38a31b3364a9c07e2418776deeTheodore Ts'o#ifdef HAVE_RECLEN_DIRENT 61fff45483ede7fe38a31b3364a9c07e2418776deeTheodore Ts'o if (len < dep->d_reclen) 62fff45483ede7fe38a31b3364a9c07e2418776deeTheodore Ts'o len = dep->d_reclen; 63593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o if (len > max_len) 64593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o len = max_len; 65fff45483ede7fe38a31b3364a9c07e2418776deeTheodore Ts'o#endif 66593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o memcpy(de, dep, len); 6714bd240b4607971151611626ec83dc821f92be5fTheodore Ts'o if ((*func)(dir_name, de, private)) 6814bd240b4607971151611626ec83dc821f92be5fTheodore Ts'o ret++; 69593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o } 70593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o free(de); 71593c6ead7e3bca412eff2d17edad790de81cb0ebTheodore Ts'o closedir(dir); 7214bd240b4607971151611626ec83dc821f92be5fTheodore Ts'o return ret; 733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 74