[project @ 2002-03-26 21:02:19 by sof]
[haskell-directory.git] / cbits / dirUtils.c
index a224004..d6ca576 100644 (file)
@@ -1,75 +1,58 @@
 /* 
- * (c) The GRASP/AQUA Project, Glasgow University, 1994-
+ * (c) The University of Glasgow 2002
  *
  * Directory Runtime Support
  */
-#include "dirUtils.h"
+#include "HsBase.h"
 
 #if defined(mingw32_TARGET_OS)
 #include <windows.h>
 #endif
 
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-#endif
-#ifdef HAVE_STDDEF_H
-# include <stddef.h>
-#endif
-#ifdef HAVE_ERRNO_H
-# include <errno.h>
-#endif
-
+/*
+ * read an entry from the directory stream; opt for the
+ * re-entrant friendly way of doing this, if available.
+ */
 HsInt
-prel_mkdir(HsAddr pathName, HsInt mode)
+__hscore_readdir( HsAddr dirPtr, HsAddr pDirEnt )
 {
-#if defined(mingw32_TARGET_OS)
-  return mkdir(pathName);
+  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 mkdir(pathName,mode);
+    nm_max = pathconf(".", _PC_NAME_MAX);
+    if (nm_max == -1) { nm_max = 255; }
+    nm_max++;
 #endif
-}
-
-HsInt
-prel_lstat(HsAddr fname, HsAddr st)
-{
-#ifdef HAVE_LSTAT
-  return lstat((const char*)fname, (struct stat*)st);
+  }
+  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
-  return stat((const char*)fname, (struct stat*)st);
-#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; }
+  if (pDirE == NULL) {
+    return -1;
+  }
 
-time_t prel_st_mtime(struct stat* st) { return st->st_mtime; }
-mode_t prel_st_mode(struct stat* st) { return st->st_mode; }
-
-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  
-}
-