119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * iod.c - Iterate a function on each entry of a directory 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1993, 1994 Remy Card <card@masi.ibp.fr> 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Laboratoire MASI, Institut Blaise Pascal 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Universite Pierre et Marie Curie (Paris VI) 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 88558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * %Begin-Header% 98558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * This file may be redistributed under the terms of the GNU Library 108558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * General Public License, version 2. 118558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * %End-Header% 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * History: 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 93/10/30 - Creation 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2p.h" 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_UNISTD_H 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdlib.h> 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h> 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint iterate_on_dir (const char * dir_name, 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int (*func) (const char *, struct dirent *, void *), 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void * private) 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project DIR * dir; 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct dirent *de, *dep; 323984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int max_len = -1, len, ret = 0; 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 343984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#if HAVE_PATHCONF && defined(_PC_NAME_MAX) 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project max_len = pathconf(dir_name, _PC_NAME_MAX); 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (max_len == -1) { 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef _POSIX_NAME_MAX 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project max_len = _POSIX_NAME_MAX; 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef NAME_MAX 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project max_len = NAME_MAX; 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project max_len = 256; 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif /* NAME_MAX */ 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif /* _POSIX_NAME_MAX */ 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project max_len += sizeof(struct dirent); 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project de = malloc(max_len+1); 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!de) 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset(de, 0, max_len+1); 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project dir = opendir (dir_name); 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (dir == NULL) { 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project free(de); 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while ((dep = readdir (dir))) { 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_RECLEN_DIRENT 623984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt len = dep->d_reclen; 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (len > max_len) 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project len = max_len; 653984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#else 663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt len = sizeof(struct dirent); 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memcpy(de, dep, len); 693984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if ((*func)(dir_name, de, private)) 703984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ret++; 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project free(de); 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project closedir(dir); 743984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt return ret; 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 76