X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=cbits%2FdirUtils.c;h=8d94a459f246ca45e5184084e060d86bba135883;hb=68167dda4283c82f581b0960500d9711b49da31f;hp=a2240046384be132c56a21742b551dccd09b0e3b;hpb=260e7f2ed9a43c6ecf5a556d77817f39ed2893ab;p=haskell-directory.git diff --git a/cbits/dirUtils.c b/cbits/dirUtils.c index a224004..8d94a45 100644 --- a/cbits/dirUtils.c +++ b/cbits/dirUtils.c @@ -1,75 +1,67 @@ /* - * (c) The GRASP/AQUA Project, Glasgow University, 1994- + * (c) The University of Glasgow 2002 * * Directory Runtime Support */ -#include "dirUtils.h" -#if defined(mingw32_TARGET_OS) -#include -#endif +#include "config.h" -#ifdef HAVE_STDLIB_H -# include -#endif -#ifdef HAVE_STDDEF_H -# include -#endif -#ifdef HAVE_ERRNO_H -# include +// The following is required on Solaris to force the POSIX versions of +// the various _r functions instead of the Solaris versions. +#ifdef solaris2_TARGET_OS +#define _POSIX_PTHREAD_SEMANTICS #endif -HsInt -prel_mkdir(HsAddr pathName, HsInt mode) -{ +#include "HsBase.h" + #if defined(mingw32_TARGET_OS) - return mkdir(pathName); -#else - return mkdir(pathName,mode); +#include #endif -} +/* + * read an entry from the directory stream; opt for the + * re-entrant friendly way of doing this, if available. + */ HsInt -prel_lstat(HsAddr fname, HsAddr st) +__hscore_readdir( HsAddr dirPtr, HsAddr pDirEnt ) { -#ifdef HAVE_LSTAT - return lstat((const char*)fname, (struct stat*)st); + struct dirent **pDirE = (struct dirent**)pDirEnt; +#if HAVE_READDIR_R + struct dirent* p; + int res; + static unsigned int nm_max = -1; + + if (pDirE == NULL) { + return -1; + } + if (nm_max == -1) { +#ifdef NAME_MAX + nm_max = NAME_MAX + 1; #else - return stat((const char*)fname, (struct stat*)st); + nm_max = pathconf(".", _PC_NAME_MAX); + if (nm_max == -1) { nm_max = 255; } + nm_max++; #endif -} - -HsInt prel_s_ISDIR(mode_t m) {return S_ISDIR(m);} -HsInt prel_s_ISREG(mode_t m) {return S_ISREG(m);} - -HsInt prel_sz_stat() { return sizeof(struct stat); } -HsInt prel_path_max() { return PATH_MAX; } -mode_t prel_R_OK() { return R_OK; } -mode_t prel_W_OK() { return W_OK; } -mode_t prel_X_OK() { return X_OK; } - -mode_t prel_S_IRUSR() { return S_IRUSR; } -mode_t prel_S_IWUSR() { return S_IWUSR; } -mode_t prel_S_IXUSR() { return S_IXUSR; } + } + p = (struct dirent*)malloc(sizeof(struct dirent) + nm_max); + if (p == NULL) return -1; + res = readdir_r((DIR*)dirPtr, p, pDirE); + if (res != 0) { + *pDirE = NULL; + free(p); + } + return res; +#else -time_t prel_st_mtime(struct stat* st) { return st->st_mtime; } -mode_t prel_st_mode(struct stat* st) { return st->st_mode; } + if (pDirE == NULL) { + return -1; + } -HsAddr prel_d_name(struct dirent* d) -{ -#ifndef mingw32_TARGET_OS - return (HsAddr)(&d->d_name); -#else - return (HsAddr)(d->d_name); + *pDirE = readdir((DIR*)dirPtr); + if (*pDirE == NULL) { + return -1; + } else { + return 0; + } #endif } - -HsInt prel_end_of_dir() -{ -#ifndef mingw32_TARGET_OS - return 0; -#else - return ENOENT; -#endif -} -